<?php
/**
 * Copyright (c) 2015, 2018 Eclipse Foundation and others.
 *
 * This program and the accompanying materials are made
 * available under the terms of the Eclipse Public License 2.0
 * which is available at https://www.eclipse.org/legal/epl-2.0/
 *
 * Contributors:
 *    Nathan Gervais (Eclipse Foundation) - Initial implementation
 *    Eric Poirier (Eclipse Foundation)
 *    Christopher Guindon (Eclipse Foundation)
 *
 * SPDX-License-Identifier: EPL-2.0
 */
?>
<div class="margin-bottom-20" style="background-color:#0B328B; border-top:3px solid #FF6700;">
  <img src="images/europaBannerHere.jpg" class="img-responsive">
</div>
<p>The following are just some of the examples of what Eclipse members
  are doing with Europa.
</p>
<?php
$effects = array(
  array(
    'url' => 'http://www.access-company.com/',
    'title' => 'ACCESS Systems Americas',
    'logo' => '/membership/scripts/get_image.php?id=725&size=large',
    'body' => '<p>"We share
      Eclipse\'s commitment to an open source community, ACCESS is
      pleased to support the Europa release by upgrading the ACCESS
      Linux Platform Development Suite--the leading, open source
      toolchain for mobile development--to include CDT 4.0 and Eclipse
      3.3."</p>
      <p class="text-right"><b>Larry Berkin </b> - <a href="http://www.access-company.com/">
        Senior Director, Developer Ecosystem and Technology Acquisition </a>
      </p>'
  ),
  array(
    'url' => 'http://www.actuate.com/',
    'title' => 'Actuate Corporation',
    'logo' => '/membership/scripts/get_image.php?id=652&size=large',
    'body' => '<p>"Since its release,
  BIRT has captured the interest of the Eclipse community and
  anticipation of BIRT 2.2 has been high. BIRT has been an
  integral part of the Actuate product line from August, 2005 when
  we incorporated release 1.0 and we will continue that commitment
  with BIRT 2.2, providing value-add features, products and
  services built on top of the Eclipse open source release. This
  includes the Actuate iPortal, an enterprise-grade JEE report
  delivery application, and Interactive Viewer to provide users
  with Web 2.0-style interaction and personalization of BIRT
  reports."</p>
  <p class="text-right">
    <b>Mark Coggins </b> - <a href="
      http://www.actuate.com/
      ">Senior Vice President of Engineering </a>
  </p>'
  ),
  array(
    'url' => 'http://www.adobe.com/',
    'title' => 'Adobe Systems',
    'logo' => '/membership/scripts/get_image.php?id=821&size=large',
    'body' => '<p>"Eclipse is a great example
  of commercial cooperation in an open source world. We look
  forward to making Eclipse Europa a part of our upcoming Adobe
  Flex Builder 3 release later this year."</p>
  <p class="text-right">
    <b>Steven Heintz </b> - <a href="
      http://www.adobe.com/
      ">Senior Product Manager, Flex </a>
  </p>'
  ),
  array(
    'url' => 'http://www.avantsoft.com',
    'title' => 'AvantSoft',
    'logo' => '/membership/scripts/get_image.php?id=671&size=large',
    'body' => '<p>AvantSoft has fully adopted
  Eclipse Europa release for the benefit of its customers who have
  been awaiting the availability of Eclipse training and
  consulting on this new release. AvantSoft\'s entire suite of
  Eclipse courses (Plugins, SWT, RCP, GEF, EMF, CDT, JDT, GMF)
  have already been migrated to the new Europa release. These are
  offered world-wide through traditional classroom training or
  VIRTUAL hands-on, live, instructor-led classes conducted by
  Eclipse University of AvantSoft. Through internal training
  sessions, our consultants have been made aware of the new
  features of Europa and how to apply them to provide better
  solutions for our clients.</p>
  <p class="text-right">
    <b>Ashvin Radiya </b> - <a
      href="
      http://www.avantsoft.com
      ">President </a>
  </p>'
  ),
  array(
    'url' => 'http://www.bea.com/',
    'title' => 'BEA Systems',
    'logo' => '/membership/scripts/get_image.php?id=653&size=large',
    'body' => '<p>"The Europa Eclipse platform
  release represents a significant improvement in both
  functionality and stability," said Bill Roth, Vice President,
  Products, BEA Systems. "We have been working with it for months,
  and will be aggressively adopting it."</p>
  <p class="text-right">
    <b>Bill Roth </b> - <a href="
      http://www.bea.com/
      ">Vice President, Products </a>
  </p>'
  ),
  array(
    'url' => 'http://www.carleton.ca',
    'title' => 'Carleton University',
    'logo' => '/membership/scripts/get_image.php?id=834&size=large',
    'body' => '<p>"One of the goals of
  Carleton University\'s Talent Forge initiative is to host Eclipse
  plug-ins and educational material developed by students and
  faculty in support of Europa and future releases of Eclipse. We
  look forward to the success of Eclipse Europa."</p>
  <p class="text-right">
    <b>Dr. Dwight Deugo </b> - <a
      href="
      http://www.carleton.ca
      ">Associate Professor, School of Computer Science </a>
  </p>'
  ),
  array(
    'url' => 'http://www.codegear.com',
    'title' => 'CodeGear',
    'logo' => '',
    'body' => '<p> "Eclipse is a key part of
  CodeGear\'s product strategy, and Europa will play a central role
  in our upcoming products that enhance the Eclipse developer
  experience with productivity, collaboration, and application
  performance optimization. Our plans include enhancing the Europa
  developer experience with rapid visual development for Java
  source code, server components and SOA Web Services; Java
  application performance analysis and tuning; and advanced
  development team collaboration, communication, and project
  management capabilities. In addition to Java tools and turnkey
  IDE solutions, we also will bring out a complete Rails-focused
  Ruby development environment tailored specifically to accelerate
  Rails Web 2.0 development."
  <p class="text-right">
    <b>Michael Swindell </b> - <a
      href="
      http://www.codegear.com
      ">Vice President of Products and Strategy </a>
  </p>'
  ),
  array(
    'url' => 'http://www.genuitec.com/',
    'title' => 'Genuitec, LLC',
    'logo' => '/membership/scripts/get_image.php?id=687&size=large',
    'body' => '<p>"The Europa release
  represents a significant milestone for Eclipse, unprecedented in
  the software industry. Having 21 significant projects in the
  release train with the involvement of now 162 member companies
  solidify Eclipse as the open source standard for software tools,
  RCP and beyond. We are excited to see a growing community and a
  thriving ecosystem based on repeated success and high quality
  standards."</p>
  <p class="text-right">
    <b>Maher Masri </b> - <a href="
      http://www.genuitec.com/
      ">CEO </a>
  </p>'
  ),
  array(
    'url' => 'http://www.ingres.com',
    'title' => 'Ingres Corporation',
    'logo' => '/membership/scripts/get_image.php?id=1054&size=large',
    'body' => '<p>"We are excited that
  our application to join the Eclipse Foundation was accepted. We
  believe that the Eclipse Community has built the perfect
  environment for developing enterprise class applications for
  deployment across a wide variety of platforms. We look forward
  to becoming active community participants as well as working
  closely with the ecosystem to make a significant contribution to
  the Eclipse platform,"</p>
  <p class="text-right">
    <b>Emma McGrattan </b> - <a href="
      http://www.ingres.com
      ">Senior Vice President of Engineering </a>
  </p>'
  ),
  array(
    'url' => 'http://www.innoopract.com/',
    'title' => 'Innoopract Inc.',
    'logo' => '/membership/scripts/get_image.php?id=690&size=large',
    'body' => '<p>The Eclipse Europa release
  represents another significant step in setting new standards for
  what open source can deliver. Innoopract will include all of the
  Europa-release software in its Yoxos Eclipse distribution as
  well as its new Eclipse Discovery download service, and continue
  to drive "software as a service" technology to Eclipse.</p>
  <p class="text-right">
    <b> Eric von der Heyden </b> - <a
      href="
      http://www.innoopract.com/
      ">President </a>
  </p>'
  ),
  array(
    'url' => ' http://www.obeo.fr/',
    'title' => 'Obeo',
    'logo' => '/membership/scripts/get_image.php?id=863&size=small',
    'body' => '<p>"At Obeo we extensively use EMF as
  the core of our development tools. The Europa release brings
  exciting new features for EMF and all its component :
  transaction and validation to provide model consistency or Teneo
  for model/relational mapping. All these will help us providing
  an efficient tooling to our customers.</p>
  <p class="text-right">
    <b>Stephane Lacrampe </b> - <a
      href="
      http://www.obeo.fr/
      ">CEO </a>
  </p>'
  ),
  array(
    'url' => 'http://www.nexaweb.com/',
    'title' => 'Nexaweb',
    'logo' => '/membership/scripts/get_image.php?id=797&size=large',
    'body' => '<p>"Nexaweb Studio is a visual drag
  and drop environment for building Rich Internet Applications
  that connect Ajax with service oriented architecture. Europa is
  a significant release that we have been looking forward to. The
  new features in the core Eclipse Platform makes it much more
  flexible and customizable. Incorporating DTP, WTP and the core
  platform enhancements, Nexaweb Studio will deliver even better
  integrated experience and developer productivity."
  <p class="text-right">
    <b>Coach Wei </b> - <a href="
      http://www.nexaweb.com/
      ">CTO </a>
  </p>'
  ),
  array(
    'url' => 'http://www.qnx.com/',
    'title' => 'QNX Software Systems',
    'logo' => '/membership/scripts/get_image.php?id=890&size=large',
    'body' => '<p>"Our QNX Momentics
  IDE customers are becoming increasingly aware of the advanced
  features and benefits of Eclipse-based tooling. With the Europa
  release, we are looking forward to integrating new CDT features
  such as an improved project model, enhanced source indexing with
  static analysis features, simplified debugging, and improved
  source editing and navigation capabilities."</p>
  <p class="text-right">
    <b>Bill Graham </b> - <a href="
      http://www.qnx.com/
      ">Product Marketing Manager </a>
  </p>'
  ),
  array(
    'url' => 'http://www.ibm.com/',
    'title' => 'Rational Software, IBM',
    'logo' => '/membership/scripts/get_image.php?id=656&size=large',
    'body' => '<p>"Europa marks
  another major milestone in the history of Eclipse, reinforcing
  the value received by the millions of Eclipse users," said Lee
  Nackman, vice president, development and support, Rational
  Software, IBM. "Hundreds of products across IBM\'s software
  portfolio are built on Eclipse and the technology in Europa
  continues to strengthen the value proposition we bring to
  customers."</p>
  <p class="text-right">
    <b>Lee Nackman </b> - <a href="
      http://www.ibm.com/
      ">Vice President, Development and Support </a>
  </p>'
  ),
  array(
    'url' => 'http://www.redhat.com/',
    'title' => 'Red Hat',
    'logo' => '/membership/scripts/get_image.php?id=731&size=large',
    'body' => '<p>"The Eclipse Europa release is a
  fantastic example of the power of the open source development
  model. Having 21 projects coordinate a release is a challenge in
  any context, but the fact that Eclipse is able to do this among
  distinct projects with disparate parties and differing interests
  is a testament to the openness, quality, and speed of open
  source," said Bryan Che, product manager for tools, Red Hat.
  "Red Hat is excited to support the Eclipse Europa distribution
  and will be basing its inaugural release of the fully open
  source Red Hat Developer Studio on Eclipse Europa later this
  summer."</p>
  <p class="text-right">
    <b>Bryan Che </b> - <a href="
      http://www.redhat.com/
      ">Product Manager for Tools </a>
  </p>'
  ),
  array(
    'url' => 'http://www.scapatech.com/',
    'title' => 'Scapa Technologies',
    'logo' => '/membership/scripts/get_image.php?id=660&size=large',
    'body' => '<p>"Scapa Technologies is
  planning to adopt Europa for a new product, Scapa ITSA, in the
  fall of 2007. It will be built on the Eclipse platform and have
  as its core the B2J project in STP, with elements built around
  JDT, GEF and BIRT. Europa is the stable interoperable platform
  which makes it all work together."</p>
  <p class="text-right">
    <b>Mike Norman </b> - <a
      href="
      http://www.scapatech.com/
      ">CEO </a>
  </p>'
  ),
  array(
    'url' => 'http://www.sybase.com/',
    'title' => 'Sybase',
    'logo' => '/membership/scripts/get_image.php?id=661&size=large',
    'body' => '<p>"As a longstanding, strategic and
  dedicated Member of the Eclipse Foundation, Sybase leverages the
  Eclipse platform for internal development of a number of
  commercially built products. The upcoming version of Sybase
  WorkSpace, a unified Eclipse-based application development
  environment, incorporates both a variety of projects and new
  technology features from the new Europa release. The rich
  Eclipse ecosystem enables Sybase to deliver best-of-breed
  solutions to our customer base and the Eclipse community - a
  win-win for all."</p>
  <p class="text-right">
    <b>John Graham </b> - <a href="
      http://www.sybase.com/
      ">Project Lead - Eclipse Data Tools Platform </a>
  </p>'
  ),
  array(
    'url' => 'http://www.webtide.com/',
    'title' => 'Webtide LLC.',
    'logo' => '/membership/scripts/get_image.php?id=1221&size=large',
    'body' => '<p>"The widespread, coordinated
  release of Eclipse Europa is a great achievement and will be
  fantastic for users. Webtide, the lead developers of the Jetty
  java web server, are excited to participate and look forward to
  bringing greater productivity to developers through the
  platform,"</p>
  <p class="text-right">
    <b>Adam Lieber </b> - <a href="
      http://www.webtide.com/
      ">CEO </a>
  </p>'
  ),
  array(
    'url' => 'http://www.windriver.com/',
    'title' => 'Wind River',
    'logo' => '/membership/scripts/get_image.php?id=662&size=large',
    'body' => '<p>"The release of Eclipse Europa
  continues to demonstrate the reliability and predictability of
  open source technology from Eclipse. Wind River has contributed
  significant engineering to the C/C++ Development Tooling (CDT),
  Device Debugging (DSDP-DD) and Target Management (DSDP-TM)
  projects in preparation for Europa and for our commercial
  adoption of these technologies in our upcoming Wind River
  Workbench 3.0 development suite. We believe CDT 4.0, Device
  Debugging 0.9, and Target Management 2.0 to be significant base
  technologies for building our advanced tools for device software
  development, and we look forward to continuing our extensive
  contributions to Eclipse and to our continued adoption of
  additional Eclipse technology. Wind River is committed to
  driving open standards for the embedded software industry and
  creating complete solutions for device software optimization
  that add value across the development lifecycle."</p>
  <p class="text-right">
    <b>Steve Saunders </b> - <a
      href="
      http://www.windriver.com/
      ">Vice President, Workbench Development </a>
  </p>'
  ),
);
?>

<?php foreach ($effects as $effect):?>
<div class="row padding-bottom-30">
  <div class="col-md-4 text-center">
    <a href="<?php print $effect['url'];?>">
    <?php if (!empty($effect['logo'])): ?>
      <img src="<?php print $effect['logo'];?>"  alt="<?php print $effect['title'];?>" title="<?php print $effect['title'];?>" class="center-block img-responsive">
    <?php else:?>
      <?php print $effect['title'];?>
    <?php endif;?>
    </a>
  </div>
  <div class="col-md-20">
    <h4><a href="<?php print $effect['url'];?>"><?php print $effect['title'];?></a></h4>
     <?php print $effect['body'];?>
  </div>
</div>
<?php endforeach;?>