/* Copyright 2003, Carnegie Mellon, All Rights Reserved */ package edu.cmu.minorthird.util.gui; import java.awt.GridBagConstraints; import java.awt.GridBagLayout; import java.util.List; import javax.swing.JCheckBox; import javax.swing.JSplitPane; import javax.swing.JTextField; /** * A Viewer coupled with a ViewerControls object. * * @author William Cohen */ public class ControlledViewer extends Viewer{ static final long serialVersionUID=20080517L; private Viewer viewer=null; private ViewerControls controls=null; public ControlledViewer(){ super(); } public ControlledViewer(Viewer viewer,ViewerControls controls){ super(); setComponents(viewer,controls); } public void setComponents(Viewer viewer,ViewerControls controls){ if(!(viewer instanceof Controllable)) throw new IllegalArgumentException("viewer must be controllable"); this.controls=controls; this.viewer=viewer; controls.setControlledViewer(viewer); viewer.setSuperView(this); removeAll(); if(controls.prefersToBeResized()){ if(controls.preferredLocation()==ViewerControls.BOTTOM){ JSplitPane splitPane=new JSplitPane(JSplitPane.VERTICAL_SPLIT); splitPane.setResizeWeight(0.90); splitPane.setTopComponent(viewer); splitPane.setBottomComponent(controls); add(splitPane,fillerGBC()); }else if(controls.preferredLocation()==ViewerControls.TOP){ JSplitPane splitPane=new JSplitPane(JSplitPane.VERTICAL_SPLIT); splitPane.setResizeWeight(0.10); splitPane.setTopComponent(controls); splitPane.setBottomComponent(viewer); add(splitPane,fillerGBC()); }else if(controls.preferredLocation()==ViewerControls.RIGHT){ JSplitPane splitPane=new JSplitPane(JSplitPane.HORIZONTAL_SPLIT); splitPane.setResizeWeight(0.75); splitPane.setLeftComponent(viewer); splitPane.setRightComponent(controls); add(splitPane,fillerGBC()); }else if(controls.preferredLocation()==ViewerControls.LEFT){ JSplitPane splitPane=new JSplitPane(JSplitPane.HORIZONTAL_SPLIT); splitPane.setResizeWeight(0.25); splitPane.setLeftComponent(controls); splitPane.setRightComponent(viewer); add(splitPane,fillerGBC()); }else{ throw new IllegalArgumentException( "controls has illegal preferred location "+ controls.preferredLocation()+": "+controls); } }else{ int x1,y1,x2,y2,part; int loc=controls.preferredLocation(); if(loc==ViewerControls.BOTTOM){ x1=0; y1=0; x2=0; y2=1; part=10; }else if(loc==ViewerControls.TOP){ x1=0; y1=1; x2=0; y2=0; part=9; }else if(loc==ViewerControls.RIGHT){ x1=0; y1=0; x2=1; y2=0; part=4; }else if(loc==ViewerControls.LEFT){ x1=1; y1=0; x2=0; y2=0; part=1; }else{ throw new IllegalArgumentException( "controls has illegal preferred location "+loc+": "+controls); } GridBagConstraints gbc=fillerGBC(); gbc.gridx=x1; gbc.gridy=y1; add(viewer,gbc); gbc=fillerGBC(); gbc.gridx=x2; gbc.gridy=y2; gbc.weightx/=part; gbc.weighty/=part; add(controls,gbc); } } public ViewerControls getControls(){ return controls; } @Override protected void initialize(){ setLayout(new GridBagLayout()); } // // delegate signals & content to sub-viewer // @Override public void clearContent(){ viewer.clearContent(); } @Override public boolean canReceive(Object obj){ return viewer.canReceive(obj); } @Override public void receiveContent(Object obj){ viewer.setContent(obj); } @Override protected boolean canHandle(int signal,Object argument,List<Viewer> senders){ return viewer.canHandle(signal,argument,senders); } @Override protected void handle(int signal,Object argument,List<Viewer> senders){ viewer.handle(signal,argument,senders); } // // a very simple test case // /** a test case */ public static void main(String[] argv){ Viewer v=new ControlledViewer(new MyViewer(),new MyControls()); v.setContent("William Cohen"); new ViewerFrame("test",v); } // for test case static private class MyViewer extends TransformedVanillaViewer implements Controllable{ static final long serialVersionUID=20080517L; private boolean uc; private String prefix; private Object lastObj; @Override public Object transform(Object o){ lastObj=o; String s=o.toString(); String result=uc?s.toUpperCase():s; if(prefix!=null) result=prefix+result; System.out.println("transform: "+o+" => "+result); return result; } @Override public void applyControls(ViewerControls c){ System.out.println("controls: "+c); MyControls mc=(MyControls)c; uc=mc.ucBox.isSelected(); prefix=mc.prefixField.getText(); System.out .println("recieving: "+lastObj+" with uc="+uc+" prefix="+prefix); receiveContent(lastObj); revalidate(); } } // for test case static private class MyControls extends ViewerControls{ static final long serialVersionUID=20080517L; public JCheckBox ucBox; public JTextField prefixField; @Override public void initialize(){ ucBox=new JCheckBox("uc"); ucBox.addActionListener(this); add(ucBox); prefixField=new JTextField("the man: "); add(prefixField); addApplyButton(); } @Override public String toString(){ return "[uc: "+ucBox.isSelected()+" prefix: "+prefixField.getText()+"]"; } } }