1
0
Fork 0
mirror of https://github.com/juce-framework/JUCE.git synced 2026-01-09 23:34:20 +00:00

added the AppleRemoteDevice class

This commit is contained in:
jules 2007-07-25 16:55:55 +00:00
parent eabf835cb7
commit 2f7be7bcbe
5 changed files with 621 additions and 206 deletions

View file

@ -1,178 +1,178 @@
/*
==============================================================================
This file is part of the JUCE library - "Jules' Utility Class Extensions"
Copyright 2004-7 by Raw Material Software ltd.
------------------------------------------------------------------------------
JUCE can be redistributed and/or modified under the terms of the
GNU General Public License, as published by the Free Software Foundation;
either version 2 of the License, or (at your option) any later version.
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.
You should have received a copy of the GNU General Public License
along with JUCE; if not, visit www.gnu.org/licenses or write to the
Free Software Foundation, Inc., 59 Temple Place, Suite 330,
Boston, MA 02111-1307 USA
------------------------------------------------------------------------------
If you'd like to release a closed-source product which uses JUCE, commercial
licenses are also available: visit www.rawmaterialsoftware.com/juce for
more information.
==============================================================================
*/
#include "jucedemo_headers.h"
#include "MainDemoWindow.h"
//==============================================================================
class JUCEDemoApplication : public JUCEApplication
{
/* Important! NEVER embed objects directly inside your JUCEApplication class! Use
ONLY pointers to objects, which you should create during the initialise() method
(NOT in the constructor!) and delete in the shutdown() method (NOT in the
destructor!)
This is because the application object gets created before Juce has been properly
initialised, so any embedded objects would also get constructed too soon.
*/
MainDemoWindow* theMainWindow;
public:
//==============================================================================
JUCEDemoApplication()
: theMainWindow (0)
{
// NEVER do anything in here that could involve any Juce function being called
// - leave all your startup tasks until the initialise() method.
}
~JUCEDemoApplication()
{
// Your shutdown() method should already have done all the things necessary to
// clean up this app object, so you should never need to put anything in
// the destructor.
// Making any Juce calls in here could be very dangerous...
}
//==============================================================================
void initialise (const String& commandLine)
{
// just create the main window...
theMainWindow = new MainDemoWindow();
theMainWindow->centreWithSize (700, 600);
theMainWindow->setVisible (true);
// this little function just demonstrates a few system info calls
Logger::outputDebugString (collectSomeSystemInfo());
/* on return from this method, the app will go into its the main event
dispatch loop, and this will run until something calls
JUCEAppliction::quit().
In this case, JUCEAppliction::quit() will be called by the
demo window when the user clicks on its close button.
*/
}
void shutdown()
{
delete theMainWindow;
theMainWindow = 0;
}
//==============================================================================
const String getApplicationName()
{
return T("JUCE Demo");
}
const String getApplicationVersion()
{
return T("1.0");
}
bool moreThanOneInstanceAllowed()
{
return true;
}
void anotherInstanceStarted (const String& commandLine)
{
// This will get called if the user launches another copy of the app, but
// there's nothing that the demo app needs to do here.
}
private:
//==============================================================================
// this little function just demonstrates a few system info calls
static const String collectSomeSystemInfo()
{
String systemInfo;
systemInfo
<< T("Time and date: ") << Time::getCurrentTime().toString (true, true)
<< T("\nOperating system: ") << SystemStats::getOperatingSystemName()
<< T("\nCPU vendor: ") << SystemStats::getCpuVendor()
<< T("\nCPU speed: ") << SystemStats::getCpuSpeedInMegaherz() << T("MHz\n")
<< T("\nNumber of physical CPUs: ") << SystemStats::getNumPhysicalCpus()
<< T("\nNumber of logical CPUs: ") << SystemStats::getNumLogicalCpus()
<< T("\nCPU has MMX: ") << (SystemStats::hasMMX() ? T("yes") : T("no"))
<< T("\nCPU has SSE: ") << (SystemStats::hasSSE() ? T("yes") : T("no"))
<< T("\nCPU has SSE2: ") << (SystemStats::hasSSE2() ? T("yes") : T("no"))
<< T("\nCPU has 3DNOW: ") << (SystemStats::has3DNow() ? T("yes") : T("no"))
<< T("\nCPU has hyperthreading: ") << (SystemStats::hasHyperThreading() ? T("yes") : T("no"))
<< T("\nMemory size: ") << SystemStats::getMemorySizeInMegabytes() << T("MB\n");
int64 macAddresses[8];
const int numAddresses = SystemStats::getMACAddresses (macAddresses, 8);
for (int i = 0; i < numAddresses; ++i)
{
systemInfo
<< T("Found network card MAC address: ")
<< String::formatted (T("%02x-%02x-%02x-%02x-%02x-%02x\n"),
0xff & (int) (macAddresses [i] >> 40),
0xff & (int) (macAddresses [i] >> 32),
0xff & (int) (macAddresses [i] >> 24),
0xff & (int) (macAddresses [i] >> 16),
0xff & (int) (macAddresses [i] >> 8),
0xff & (int) macAddresses [i]);
}
systemInfo
<< T("Current executable file: ")
<< File::getSpecialLocation (File::currentExecutableFile).getFullPathName()
<< T("\nCurrent application file: ")
<< File::getSpecialLocation (File::currentApplicationFile).getFullPathName()
<< T("\nUser home directory: ")
<< File::getSpecialLocation (File::userHomeDirectory).getFullPathName()
<< T("\nUser documents directory: ")
<< File::getSpecialLocation (File::userDocumentsDirectory).getFullPathName()
<< T("\nUser application data directory: ")
<< File::getSpecialLocation (File::userApplicationDataDirectory).getFullPathName()
<< T("\nCommon application data directory: ")
<< File::getSpecialLocation (File::commonApplicationDataDirectory).getFullPathName()
<< T("\nTemp directory: ")
<< File::getSpecialLocation (File::tempDirectory).getFullPathName()
<< T("\n\n");
return systemInfo;
}
};
//==============================================================================
/*
This macro creates the application's main() function..
*/
START_JUCE_APPLICATION (JUCEDemoApplication)
/*
==============================================================================
This file is part of the JUCE library - "Jules' Utility Class Extensions"
Copyright 2004-7 by Raw Material Software ltd.
------------------------------------------------------------------------------
JUCE can be redistributed and/or modified under the terms of the
GNU General Public License, as published by the Free Software Foundation;
either version 2 of the License, or (at your option) any later version.
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.
You should have received a copy of the GNU General Public License
along with JUCE; if not, visit www.gnu.org/licenses or write to the
Free Software Foundation, Inc., 59 Temple Place, Suite 330,
Boston, MA 02111-1307 USA
------------------------------------------------------------------------------
If you'd like to release a closed-source product which uses JUCE, commercial
licenses are also available: visit www.rawmaterialsoftware.com/juce for
more information.
==============================================================================
*/
#include "jucedemo_headers.h"
#include "MainDemoWindow.h"
//==============================================================================
class JUCEDemoApplication : public JUCEApplication
{
/* Important! NEVER embed objects directly inside your JUCEApplication class! Use
ONLY pointers to objects, which you should create during the initialise() method
(NOT in the constructor!) and delete in the shutdown() method (NOT in the
destructor!)
This is because the application object gets created before Juce has been properly
initialised, so any embedded objects would also get constructed too soon.
*/
MainDemoWindow* theMainWindow;
public:
//==============================================================================
JUCEDemoApplication()
: theMainWindow (0)
{
// NEVER do anything in here that could involve any Juce function being called
// - leave all your startup tasks until the initialise() method.
}
~JUCEDemoApplication()
{
// Your shutdown() method should already have done all the things necessary to
// clean up this app object, so you should never need to put anything in
// the destructor.
// Making any Juce calls in here could be very dangerous...
}
//==============================================================================
void initialise (const String& commandLine)
{
// just create the main window...
theMainWindow = new MainDemoWindow();
theMainWindow->centreWithSize (700, 600);
theMainWindow->setVisible (true);
// this little function just demonstrates a few system info calls
Logger::outputDebugString (collectSomeSystemInfo());
/* on return from this method, the app will go into its the main event
dispatch loop, and this will run until something calls
JUCEAppliction::quit().
In this case, JUCEAppliction::quit() will be called by the
demo window when the user clicks on its close button.
*/
}
void shutdown()
{
delete theMainWindow;
theMainWindow = 0;
}
//==============================================================================
const String getApplicationName()
{
return T("JUCE Demo");
}
const String getApplicationVersion()
{
return T("1.0");
}
bool moreThanOneInstanceAllowed()
{
return true;
}
void anotherInstanceStarted (const String& commandLine)
{
// This will get called if the user launches another copy of the app, but
// there's nothing that the demo app needs to do here.
}
private:
//==============================================================================
// this little function just demonstrates a few system info calls
static const String collectSomeSystemInfo()
{
String systemInfo;
systemInfo
<< T("Time and date: ") << Time::getCurrentTime().toString (true, true)
<< T("\nOperating system: ") << SystemStats::getOperatingSystemName()
<< T("\nCPU vendor: ") << SystemStats::getCpuVendor()
<< T("\nCPU speed: ") << SystemStats::getCpuSpeedInMegaherz() << T("MHz\n")
<< T("\nNumber of physical CPUs: ") << SystemStats::getNumPhysicalCpus()
<< T("\nNumber of logical CPUs: ") << SystemStats::getNumLogicalCpus()
<< T("\nCPU has MMX: ") << (SystemStats::hasMMX() ? T("yes") : T("no"))
<< T("\nCPU has SSE: ") << (SystemStats::hasSSE() ? T("yes") : T("no"))
<< T("\nCPU has SSE2: ") << (SystemStats::hasSSE2() ? T("yes") : T("no"))
<< T("\nCPU has 3DNOW: ") << (SystemStats::has3DNow() ? T("yes") : T("no"))
<< T("\nCPU has hyperthreading: ") << (SystemStats::hasHyperThreading() ? T("yes") : T("no"))
<< T("\nMemory size: ") << SystemStats::getMemorySizeInMegabytes() << T("MB\n");
int64 macAddresses[8];
const int numAddresses = SystemStats::getMACAddresses (macAddresses, 8);
for (int i = 0; i < numAddresses; ++i)
{
systemInfo
<< T("Found network card MAC address: ")
<< String::formatted (T("%02x-%02x-%02x-%02x-%02x-%02x\n"),
0xff & (int) (macAddresses [i] >> 40),
0xff & (int) (macAddresses [i] >> 32),
0xff & (int) (macAddresses [i] >> 24),
0xff & (int) (macAddresses [i] >> 16),
0xff & (int) (macAddresses [i] >> 8),
0xff & (int) macAddresses [i]);
}
systemInfo
<< T("Current executable file: ")
<< File::getSpecialLocation (File::currentExecutableFile).getFullPathName()
<< T("\nCurrent application file: ")
<< File::getSpecialLocation (File::currentApplicationFile).getFullPathName()
<< T("\nUser home directory: ")
<< File::getSpecialLocation (File::userHomeDirectory).getFullPathName()
<< T("\nUser documents directory: ")
<< File::getSpecialLocation (File::userDocumentsDirectory).getFullPathName()
<< T("\nUser application data directory: ")
<< File::getSpecialLocation (File::userApplicationDataDirectory).getFullPathName()
<< T("\nCommon application data directory: ")
<< File::getSpecialLocation (File::commonApplicationDataDirectory).getFullPathName()
<< T("\nTemp directory: ")
<< File::getSpecialLocation (File::tempDirectory).getFullPathName()
<< T("\n\n");
return systemInfo;
}
};
//==============================================================================
/*
This macro creates the application's main() function..
*/
START_JUCE_APPLICATION (JUCEDemoApplication)

View file

@ -1024,6 +1024,85 @@ public:
}
};
#if JUCE_MAC
//==============================================================================
/** This pops open a dialog box and waits for you to press keys on your Apple Remote,
which it describes in the box.
*/
class AppleRemoteTestWindow : public AlertWindow,
public AppleRemoteDevice
{
public:
AppleRemoteTestWindow()
: AlertWindow ("Apple Remote Control Test!",
"If you've got an Apple Remote, press some buttons now...",
AlertWindow::NoIcon)
{
addButton (T("done"), 0);
// (To open the device in non-exclusive mode, pass 'false' in here)..
if (! start (true))
setMessage ("Couldn't open the remote control device!");
}
~AppleRemoteTestWindow()
{
stop();
}
void buttonPressed (const ButtonType buttonId, const bool isDown)
{
String desc;
switch (buttonId)
{
case menuButton:
desc = "menu button (short)";
break;
case playButton:
desc = "play button";
break;
case plusButton:
desc = "plus button";
break;
case minusButton:
desc = "minus button";
break;
case rightButton:
desc = "right button (short)";
break;
case leftButton:
desc = "left button (short)";
break;
case rightButton_Long:
desc = "right button (long)";
break;
case leftButton_Long:
desc = "left button (long)";
break;
case menuButton_Long:
desc = "menu button (long)";
break;
case playButtonSleepMode:
desc = "play (sleep mode)";
break;
case switched:
desc = "remote switched";
break;
}
if (isDown)
desc << " -- [down]";
else
desc << " -- [up]";
setMessage (desc);
}
};
#endif
//==============================================================================
const int numGroups = 4;
@ -1085,67 +1164,71 @@ public:
else if (button == menuButton)
{
PopupMenu m;
m.addItem (1, T("normal item"));
m.addItem (2, T("disabled item"), false);
m.addItem (3, T("ticked item"), true, true);
m.addColouredItem (4, T("coloured item"), Colours::green);
m.addItem (1, T("Normal item"));
m.addItem (2, T("Disabled item"), false);
m.addItem (3, T("Ticked item"), true, true);
m.addColouredItem (4, T("Coloured item"), Colours::green);
m.addSeparator();
m.addCustomItem (5, new CustomMenuComponent());
m.addSeparator();
PopupMenu tabsMenu;
tabsMenu.addItem (1001, T("show tabs at the top"), true, tabs->getOrientation() == TabbedButtonBar::TabsAtTop);
tabsMenu.addItem (1002, T("show tabs at the bottom"), true, tabs->getOrientation() == TabbedButtonBar::TabsAtBottom);
tabsMenu.addItem (1003, T("show tabs at the left"), true, tabs->getOrientation() == TabbedButtonBar::TabsAtLeft);
tabsMenu.addItem (1004, T("show tabs at the right"), true, tabs->getOrientation() == TabbedButtonBar::TabsAtRight);
m.addSubMenu (T("tab position"), tabsMenu);
tabsMenu.addItem (1001, T("Show tabs at the top"), true, tabs->getOrientation() == TabbedButtonBar::TabsAtTop);
tabsMenu.addItem (1002, T("Show tabs at the bottom"), true, tabs->getOrientation() == TabbedButtonBar::TabsAtBottom);
tabsMenu.addItem (1003, T("Show tabs at the left"), true, tabs->getOrientation() == TabbedButtonBar::TabsAtLeft);
tabsMenu.addItem (1004, T("Show tabs at the right"), true, tabs->getOrientation() == TabbedButtonBar::TabsAtRight);
m.addSubMenu (T("Tab position"), tabsMenu);
m.addSeparator();
PopupMenu dialogMenu;
dialogMenu.addItem (100, T("show a plain alert-window..."));
dialogMenu.addItem (101, T("show an alert-window with a 'warning' icon..."));
dialogMenu.addItem (102, T("show an alert-window with an 'info' icon..."));
dialogMenu.addItem (103, T("show an alert-window with a 'question' icon..."));
dialogMenu.addItem (100, T("Show a plain alert-window..."));
dialogMenu.addItem (101, T("Show an alert-window with a 'warning' icon..."));
dialogMenu.addItem (102, T("Show an alert-window with an 'info' icon..."));
dialogMenu.addItem (103, T("Show an alert-window with a 'question' icon..."));
dialogMenu.addSeparator();
dialogMenu.addItem (110, T("show an ok/cancel alert-window..."));
dialogMenu.addItem (110, T("Show an ok/cancel alert-window..."));
dialogMenu.addSeparator();
dialogMenu.addItem (111, T("show an alert-window with some extra components..."));
dialogMenu.addItem (111, T("Show an alert-window with some extra components..."));
dialogMenu.addSeparator();
dialogMenu.addItem (112, T("show a ThreadWithProgressWindow demo..."));
dialogMenu.addItem (112, T("Show a ThreadWithProgressWindow demo..."));
m.addSubMenu (T("AlertWindow demonstrations"), dialogMenu);
dialogMenu.addSeparator();
m.addSeparator();
m.addItem (120, T("show a colour selector demo..."));
m.addItem (120, T("Show a colour selector demo..."));
m.addSeparator();
dialogMenu.addSeparator();
#if JUCE_MAC
m.addItem (140, T("Run the Apple Remote Control test..."));
m.addSeparator();
#endif
PopupMenu nativeFileChoosers;
nativeFileChoosers.addItem (121, T("'load' file browser..."));
nativeFileChoosers.addItem (124, T("'load' file browser with an image file preview..."));
nativeFileChoosers.addItem (122, T("'save' file browser..."));
nativeFileChoosers.addItem (123, T("choose directory file browser..."));
nativeFileChoosers.addItem (121, T("'Load' file browser..."));
nativeFileChoosers.addItem (124, T("'Load' file browser with an image file preview..."));
nativeFileChoosers.addItem (122, T("'Save' file browser..."));
nativeFileChoosers.addItem (123, T("'Choose directory' file browser..."));
PopupMenu juceFileChoosers;
juceFileChoosers.addItem (131, T("'load' file browser..."));
juceFileChoosers.addItem (134, T("'load' file browser with an image file preview..."));
juceFileChoosers.addItem (132, T("'save' file browser..."));
juceFileChoosers.addItem (133, T("choose directory file browser..."));
juceFileChoosers.addItem (131, T("'Load' file browser..."));
juceFileChoosers.addItem (134, T("'Load' file browser with an image file preview..."));
juceFileChoosers.addItem (132, T("'Save' file browser..."));
juceFileChoosers.addItem (133, T("'Choose directory' file browser..."));
PopupMenu fileChoosers;
fileChoosers.addSubMenu (T("Operating system dialogs"), nativeFileChoosers);
fileChoosers.addSubMenu (T("Juce dialogs"), juceFileChoosers);
m.addSubMenu (T("file chooser dialogs"), fileChoosers);
m.addSubMenu (T("File chooser dialogs"), fileChoosers);
int result = m.showAt (menuButton);
@ -1232,6 +1315,13 @@ public:
// method causes the loop to exit.
colourDialog.runModalLoop();
}
else if (result == 140)
{
#if JUCE_MAC
AppleRemoteTestWindow test;
test.runModalLoop();
#endif
}
else if (result >= 121 && result < 139)
{
const bool useNativeVersion = result < 130;