/*! * This program is free software; you can redistribute it and/or modify it under the * terms of the GNU Lesser General Public License, version 2.1 as published by the Free Software * Foundation. * * You should have received a copy of the GNU Lesser General Public License along with this * program; if not, you can obtain a copy at http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html * or from the Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. * * 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 Lesser General Public License for more details. * * Copyright (c) 2002-2013 Pentaho Corporation.. All rights reserved. */ package org.pentaho.reporting.designer.core.xul; import org.pentaho.reporting.designer.core.DesignerContextComponent; import org.pentaho.reporting.designer.core.ReportDesignerContext; import org.pentaho.reporting.designer.core.ReportDesignerUiPlugin; import org.pentaho.reporting.designer.core.ReportDesignerUiPluginRegistry; import org.pentaho.ui.xul.XulComponent; import org.pentaho.ui.xul.XulDomContainer; import org.pentaho.ui.xul.XulException; import org.pentaho.ui.xul.XulLoader; import org.pentaho.ui.xul.containers.XulMenu; import org.pentaho.ui.xul.containers.XulMenupopup; import org.pentaho.ui.xul.containers.XulWindow; import org.pentaho.ui.xul.dom.Document; import org.pentaho.ui.xul.impl.XulEventHandler; import javax.swing.*; import java.util.Iterator; import java.util.List; import java.util.Map; public class XulDesignerFrame { private static final String DIALOG_DEFINITION_FILE = "org/pentaho/reporting/designer/core/xul/designer-frame.xul"; //$NON-NLS-1$ private XulWindow window; private ReportDesignerContext reportDesignerContext; public XulDesignerFrame() throws XulException { final ActionSwingXulLoader loader = new ActionSwingXulLoader(); final ReportDesignerUiPlugin[] plugins = ReportDesignerUiPluginRegistry.getInstance().getPlugins(); for ( int i = 0; i < plugins.length; i++ ) { final ReportDesignerUiPlugin plugin = plugins[ i ]; final Map<String, String> map = plugin.getXulAdditionalHandlers(); final Iterator<Map.Entry<String, String>> entryIterator = map.entrySet().iterator(); while ( entryIterator.hasNext() ) { final Map.Entry<String, String> entry = entryIterator.next(); loader.register( entry.getKey(), entry.getValue() ); } } final XulDomContainer container = loader.loadXul( DIALOG_DEFINITION_FILE ); final Document documentRoot = container.getDocumentRoot(); for ( int i = 0; i < plugins.length; i++ ) { final ReportDesignerUiPlugin plugin = plugins[ i ]; final String[] strings = plugin.getOverlaySources(); for ( int j = 0; j < strings.length; j++ ) { final String source = strings[ j ]; documentRoot.addOverlay( source ); } } for ( int i = 0; i < plugins.length; i++ ) { final ReportDesignerUiPlugin plugin = plugins[ i ]; final XulEventHandler[] xulEventHandlers = plugin.createEventHandlers(); for ( int j = 0; j < xulEventHandlers.length; j++ ) { final XulEventHandler eventHandler = xulEventHandlers[ j ]; container.addEventHandler( eventHandler ); } } container.initialize(); final XulComponent root = documentRoot.getRootElement(); if ( root instanceof XulWindow ) { window = (XulWindow) root; } else { throw new XulException( "Error getting Xul Database Dialog root, element of type: " + root ); } } public XulWindow getWindow() { return window; } public JMenuBar getMenuBar() { return getComponent( "main-menubar", JMenuBar.class );//NON-NLS } public <T extends XulComponent> T getXulComponent( String id, Class<T> type ) { final XulComponent mainMenuBar = window.getElementById( id ); if ( mainMenuBar == null ) { return null; } if ( type.isInstance( mainMenuBar ) ) { return (T) mainMenuBar; } return null; } public <T extends JComponent> T getComponent( String id, Class<T> type ) { final XulComponent mainMenuBar = window.getElementById( id ); if ( mainMenuBar == null ) { return null; } final Object o = mainMenuBar.getManagedObject(); if ( type.isInstance( o ) ) { return (T) o; } return null; } public void setReportDesignerContext( final ReportDesignerContext reportDesignerContext ) { this.reportDesignerContext = reportDesignerContext; installContext( window ); } public ReportDesignerContext getReportDesignerContext() { return reportDesignerContext; } private void installContext( final XulComponent component ) { final List<XulComponent> xulComponents = component.getChildNodes(); for ( int i = 0; i < xulComponents.size(); i++ ) { final XulComponent child = xulComponents.get( i ); if ( child instanceof DesignerContextComponent ) { final DesignerContextComponent asm = (DesignerContextComponent) child; asm.setReportDesignerContext( reportDesignerContext ); } installContext( child ); } } public ActionSwingMenuitem createMenu( final Action action ) { final ActionSwingMenuitem item = new ActionSwingMenuitem( null, null, null, "menu-item" );//NON-NLS item.setAction( action ); return item; } public XulMenupopup createPopupMenu( final String label, final XulComponent parent ) throws XulException { final XulLoader xulLoader = window.getXulDomContainer().getXulLoader(); final XulMenu menu = (XulMenu) xulLoader.createElement( "MENU" ); menu.setLabel( label ); parent.addChild( menu ); final XulMenupopup childPopup = (XulMenupopup) xulLoader.createElement( "MENUPOPUP" ); menu.addChild( childPopup ); return childPopup; } }