package siprp.higiene.legislacoes; import static com.evolute.utils.strings.UnicodeLatin1Map.atilde; import static com.evolute.utils.strings.UnicodeLatin1Map.ccedil; import static com.evolute.utils.strings.UnicodeLatin1Map.otilde; import info.clearthought.layout.TableLayout; import info.clearthought.layout.TableLayoutConstraints; import java.awt.Color; import java.awt.Dimension; import java.awt.GridLayout; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.util.List; import javax.swing.BorderFactory; import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.JPanel; import javax.swing.JScrollPane; import javax.swing.JTextArea; import javax.swing.JTree; import javax.swing.SwingUtilities; import javax.swing.event.CaretEvent; import javax.swing.event.CaretListener; import javax.swing.event.TreeSelectionEvent; import javax.swing.event.TreeSelectionListener; import javax.swing.tree.DefaultMutableTreeNode; import javax.swing.tree.DefaultTreeModel; import javax.swing.tree.TreePath; import javax.swing.tree.TreeSelectionModel; import siprp.database.cayenne.objects.Legislacao; import siprp.database.cayenne.providers.PlanoActuacaoDAO; import com.evolute.utils.tracker.TrackableWindow; public class GestaoLegislacoesWindow extends JFrame implements TrackableWindow { private static final long serialVersionUID = 1L; public static final String TITLE = "Gest" + atilde + "o de Legisla" + ccedil + otilde + "es"; private static final Dimension SIZE = new Dimension( 800, 400 ); private DefaultMutableTreeNode root = new DefaultMutableTreeNode( "" ); private final DefaultTreeModel model = new DefaultTreeModel( root ); private final JTree tree = new JTree( model ); private final JScrollPane scroll = new JScrollPane( tree ); private final JButton buttonCriar = new JButton("Criar"); private final JButton buttonRemover = new JButton("Remover"); private final JButton buttonGuardar = new JButton("Guardar"); private final JButton buttonCancelar = new JButton("Cancelar"); private final JTextArea text = new JTextArea(); private final JPanel panelTree = new JPanel(); private final JPanel panelText = new JPanel(); private final PlanoActuacaoDAO provider = new PlanoActuacaoDAO(); private Legislacao newLegislacao = null; public static void main( String[] args ) { GestaoLegislacoesWindow window = new GestaoLegislacoesWindow(); window.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE ); window.setVisible( true ); } public GestaoLegislacoesWindow() { this.setTitle( TITLE ); this.setSize( SIZE ); startupComponents(); startupLayout(); startupListeners(); placeComponents(); refresh(); } private void startupComponents() { panelText.setBorder( BorderFactory.createEtchedBorder() ); buttonRemover.setEnabled( false ); buttonGuardar.setEnabled( false ); buttonCancelar.setEnabled( false ); text.setEnabled( false ); tree.getSelectionModel().setSelectionMode( TreeSelectionModel.SINGLE_TREE_SELECTION ); tree.setRootVisible( false ); } private void startupLayout() { startupPanelTextLayout(); startupPanelTreeLayout(); this.getContentPane().setLayout( new GridLayout(1,0,5,5) ); } private void startupPanelTextLayout() { TableLayout layout = new TableLayout( new double[]{ TableLayout.MINIMUM, TableLayout.MINIMUM, TableLayout.FILL }, new double[]{ TableLayout.FILL, TableLayout.MINIMUM } ); layout.setHGap( 5 ); layout.setVGap( 5 ); panelText.setLayout( layout ); } private void startupPanelTreeLayout() { TableLayout layout = new TableLayout( new double[]{ TableLayout.MINIMUM, TableLayout.MINIMUM, TableLayout.FILL }, new double[]{ TableLayout.FILL, TableLayout.MINIMUM } ); layout.setHGap( 5 ); layout.setVGap( 5 ); panelTree.setLayout( layout ); } private void startupListeners() { buttonCriar.addActionListener( new ActionListener() { @Override public void actionPerformed( ActionEvent e ) { criarLegislacao( ); } } ); buttonRemover.addActionListener( new ActionListener() { @Override public void actionPerformed( ActionEvent e ) { removerLegislacao(); } } ); buttonGuardar.addActionListener( new ActionListener() { @Override public void actionPerformed( ActionEvent e ) { guardarLegislacao(); } } ); buttonCancelar.addActionListener( new ActionListener() { @Override public void actionPerformed( ActionEvent e ) { cancelarEdicao(); } } ); tree.getSelectionModel().addTreeSelectionListener( new TreeSelectionListener() { @Override public void valueChanged( TreeSelectionEvent e ) { TreePath path = tree.getSelectionPath(); Legislacao legislacao = getSelectedLegislacao(); if( path != null ) { buttonRemover.setEnabled( !root.equals( path.getLastPathComponent() ) ); text.setEnabled( !root.equals( path.getLastPathComponent() ) ); text.setText( legislacao == null ? "" : legislacao.getDescription() ); } else { text.setEnabled( false ); buttonRemover.setEnabled( false ); text.setText( "" ); } } } ); text.addCaretListener( new CaretListener() { @Override public void caretUpdate( CaretEvent e ) { if( text.getText().length() > 0) { Legislacao legislacao = null; if( newLegislacao != null ) { legislacao = newLegislacao; } else { legislacao = getSelectedLegislacao(); } boolean changed = legislacao == null ? false : !legislacao.getDescription().equals( text.getText() ); buttonGuardar.setEnabled( changed ); text.setBorder( changed ? BorderFactory.createLineBorder( Color.RED, 2 ) : BorderFactory.createEtchedBorder() ); } else { buttonGuardar.setEnabled( false ); text.setBorder( BorderFactory.createEtchedBorder() ); } } } ); } private void placeComponents() { panelTree.add( scroll, new TableLayoutConstraints( 0, 0, 2, 0 ) ); panelTree.add( buttonCriar, new TableLayoutConstraints( 0, 1 ) ); panelTree.add( buttonRemover, new TableLayoutConstraints( 1, 1 ) ); panelText.add( text, new TableLayoutConstraints( 0, 0, 2, 0 ) ); panelText.add( buttonGuardar, new TableLayoutConstraints( 0, 1 ) ); panelText.add( buttonCancelar, new TableLayoutConstraints( 1, 1 ) ); this.getContentPane().add( panelTree ); this.getContentPane().add( panelText ); } private void criarLegislacao() { text.setText( "" ); Legislacao selected = getSelectedLegislacao(); if( selected != null ) { newLegislacao = provider.createNovaLegislacao( selected ); } else { newLegislacao = provider.createNovaLegislacao( getSelectedLegislacao() ); } prepareEditar( false ); textInputOnly( true ); } private void prepareEditar( boolean editar ) { buttonGuardar.setText( editar ? "Editar" : "Criar" ); buttonCancelar.setText( editar ? "Reverter" : "Cancelar" ); } private void textInputOnly( boolean doTextInput ) { text.setEnabled( doTextInput ); buttonCancelar.setEnabled( doTextInput ); buttonCriar.setEnabled( !doTextInput ); tree.setEnabled( !doTextInput ); text.setBorder( doTextInput ? BorderFactory.createLineBorder( Color.RED, 2 ) : BorderFactory.createEtchedBorder()); if( doTextInput ){ text.setCaretPosition( 0 ); text.requestFocus(); buttonRemover.setEnabled( false ); } } private void guardarLegislacao() { TreePath path = tree.getSelectionPath(); if( newLegislacao != null ) { newLegislacao.setDescription( text.getText() ); provider.commit(); newLegislacao = null; prepareEditar( true ); textInputOnly( false ); refresh(); } else if( path != null ) { Legislacao legislacao = getSelectedLegislacao(); legislacao.setDescription( text.getText() ); provider.commit(); prepareEditar( true ); textInputOnly( false ); refresh(); } } private void cancelarEdicao() { TreePath path = tree.getSelectionPath(); if( newLegislacao != null ) { newLegislacao = null; prepareEditar( true ); textInputOnly( false ); refresh(); tree.setSelectionPath( path ); } else if( path != null ) { prepareEditar( true ); textInputOnly( false ); refresh(); tree.setSelectionPath( path ); } } private Legislacao getSelectedLegislacao() { Legislacao result = null; TreePath path = tree.getSelectionPath(); if( path != null ) { Object o = ( (DefaultMutableTreeNode) path.getLastPathComponent() ).getUserObject(); if( o instanceof Legislacao ) { result = (Legislacao) o; } } return result; } private void removerLegislacao() { Legislacao legislacao = getSelectedLegislacao(); if( legislacao != null ) { provider.delete( legislacao ); } refresh(); } @Override public void refresh() { clearTree(); fillTree(); } private void clearTree() { root.removeAllChildren(); refreshTree(); } private void fillTree() { List legislacoes = provider.getAllLegislacoes( null ); for( Legislacao legislacao : legislacoes ) { DefaultMutableTreeNode node = new DefaultMutableTreeNode( legislacao ); fillWithChildren( node, legislacao ); root.add( node ); } refreshTree(); } private void fillWithChildren( DefaultMutableTreeNode node, Legislacao legislacao ) { if( legislacao != null ) { for( Legislacao child : legislacao.getChildrenArray() ) { DefaultMutableTreeNode childNode = new DefaultMutableTreeNode(child); fillWithChildren( childNode, child ); node.add( childNode ); } } } private void refreshTree() { model.nodeStructureChanged( root ); } @Override public boolean closeIfPossible() { close(); return true; } private void close() { SwingUtilities.invokeLater( new Runnable() { public void run() { setVisible( false ); dispose(); } } ); } @Override public void open() { setVisible( true ); } }