/** * Copyright 2012 Tobias Gierke <tobias.gierke@code-sourcery.de> * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package de.codesourcery.jasm16.ide.ui.viewcontainers; import java.awt.GridBagConstraints; import java.awt.GridBagLayout; import java.awt.event.WindowAdapter; import java.awt.event.WindowEvent; import java.util.Collections; import java.util.List; import javax.swing.JFrame; import javax.swing.JMenuBar; import javax.swing.JPanel; import org.apache.commons.lang.StringUtils; import de.codesourcery.jasm16.ide.ui.MenuManager; import de.codesourcery.jasm16.ide.ui.utils.UIUtils; import de.codesourcery.jasm16.ide.ui.views.IView; import de.codesourcery.jasm16.ide.ui.views.IViewStateListener; /** * A view container that inherits from {@link JFrame} and * holds at most a single view. * * @author tobias.gierke@code-sourcery.de */ public class ViewFrame extends JFrame implements IViewContainer { private final IView component; private final ViewContainerHelper helper = new ViewContainerHelper(); private final MenuManager menuManager = new MenuManager() { @Override public void menuBarChanged() { setJMenuBar( menuManager.getMenuBar() ); } }; private JMenuBar menuBar; public ViewFrame(String title,final IView component) { super(title); if ( component == null ) { throw new IllegalArgumentException("component must not be NULL."); } this.component = component; addWindowListener( new WindowAdapter() { @Override public void windowClosing(WindowEvent e) { disposeView( component ); helper.fireViewContainerClosed( ViewFrame.this ); } } ); setDefaultCloseOperation(DISPOSE_ON_CLOSE); final JPanel panel = new JPanel(); panel.setLayout( new GridBagLayout() ); final GridBagConstraints cnstrs = new GridBagConstraints(); cnstrs.weightx=1.0d; cnstrs.weighty =1.0d; cnstrs.fill = GridBagConstraints.BOTH; cnstrs.gridheight = GridBagConstraints.REMAINDER; cnstrs.gridwidth = GridBagConstraints.REMAINDER; cnstrs.gridx=0; cnstrs.gridy=0; panel.add( component.getPanel(this) , cnstrs ); getContentPane().add( panel ); pack(); } @Override public void setBlockAllUserInput(boolean yesNo) { UIUtils.setBlockAllUserInput( this , yesNo ); } @Override public void disposeView(IView view) { if ( view == component ) { component.dispose(); dispose(); } } @Override public void toFront(IView view) { } @Override public IView addView(IView view) { throw new UnsupportedOperationException("showView()"); } @Override public List<IView> getViews() { return Collections.singletonList( component ); } @Override public void setTitle(IView view, String title) { setTitle( title ); } @Override public IView getViewByID(String viewId) { if (StringUtils.isBlank(viewId)) { throw new IllegalArgumentException("viewId must not be blank/null"); } if ( component == null ) { return null; } return component.getID().equals( viewId ) ? component : null; } @Override public MenuManager getMenuManager() { if ( menuBar == null ) { menuBar = menuManager.getMenuBar(); setJMenuBar( menuBar ); } return menuManager; } @Override public void setVisible(boolean b) { super.setVisible(b); visibilityChanged(b); } private void visibilityChanged(boolean visible) { if ( ! (component instanceof IViewStateListener) ) { return; } if ( visible ) { ((IViewStateListener) component).viewVisible(); } else { ((IViewStateListener) component).viewHidden(); } } @Override public String getID() { return component.getID(); } @Override public void addViewContainerListener(IViewContainerListener listener) { helper.addViewContainerListener( listener ); } @Override public void removeViewContainerListener(IViewContainerListener listener) { helper.removeViewContainerListener( listener ); } }