Java tutorial
/** * See the NOTICE file distributed with this work for additional * information regarding copyright ownership. * * This is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation; either version 2.1 of * the License, or (at your option) any later version. * * This software 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. * * You should have received a copy of the GNU Lesser General Public * License along with this software; if not, write to the Free * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA * 02110-1301 USA, or see the FSF site: http://www.fsf.org. */ package org.ut.biolab.medsavant.client.project; import com.jidesoft.pane.CollapsiblePane; import com.jidesoft.pane.CollapsiblePanes; import java.awt.*; import java.rmi.RemoteException; import java.sql.SQLException; import java.util.logging.Level; import java.util.logging.Logger; import javax.swing.BorderFactory; import javax.swing.JComponent; import javax.swing.JLabel; import javax.swing.JPanel; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.ut.biolab.medsavant.MedSavantClient; import org.ut.biolab.medsavant.client.controller.ResultController; import org.ut.biolab.medsavant.client.view.login.LoginController; import org.ut.biolab.medsavant.client.reference.ReferenceController; import org.ut.biolab.medsavant.client.util.ClientMiscUtils; import org.ut.biolab.medsavant.client.util.MedSavantExceptionHandler; import org.ut.biolab.medsavant.client.view.component.KeyValuePairPanel; import org.ut.biolab.medsavant.client.view.app.MultiSectionApp; import org.ut.biolab.medsavant.client.view.app.AppSubSection; import org.ut.biolab.medsavant.client.view.util.ViewUtil; import org.ut.biolab.medsavant.shared.model.SessionExpiredException; /** * * @author tarkvara */ public class ProjectSummaryPage extends AppSubSection { private static final Log LOG = LogFactory.getLog(ProjectSummaryPage.class); private final String projectName; private final int projectID; ProjectSummaryPage(MultiSectionApp parent) { super(parent, "Summary"); projectName = ProjectController.getInstance().getCurrentProjectName(); projectID = ProjectController.getInstance().getCurrentProjectID(); } @Override public JPanel getView() { JPanel view = new JPanel(); ViewUtil.applyVerticalBoxLayout(view); //view.setLayout(new GridBagLayout()); JLabel title = new JLabel(ProjectController.getInstance().getCurrentProjectName() + " Project"); title.setBorder(ViewUtil.getBigBorder()); title.setOpaque(false); title.setFont(ViewUtil.getMediumTitleFont()); CollapsiblePanes panes = new CollapsiblePanes(); panes.add(createPatientSummary()); panes.add(createVariantSummary()); panes.add(createReferenceSummary()); panes.addExpansion(); view.add(title); view.add(panes); return view; } private static JComponent checkException(String capt, ValueFetcher fetcher) { JComponent comp; try { comp = fetcher.getValue(); } catch (Exception ex) { LOG.error("Unable to fetch value for " + capt, ex); comp = new JLabel(String.format("<html><font color=\"red\">Unable to fetch value for %s: %s</font>", capt, ClientMiscUtils.getMessage(ex))); } return comp; } private CollapsiblePane createPatientSummary() { CollapsiblePane p = new CollapsiblePane("Patients"); p.setStyle(CollapsiblePane.TREE_STYLE); p.setCollapsible(false); p.getContentPane().setLayout(new BorderLayout()); KeyValuePairPanel kvp = new KeyValuePairPanel(); p.add(kvp, BorderLayout.CENTER); ValueFetcher pFetcher = new ValueFetcher() { @Override public JComponent getValue() throws SQLException, RemoteException { try { return new JLabel(ViewUtil.numToString(MedSavantClient.PatientManager .getPatients(LoginController.getSessionID(), projectID).size())); } catch (SessionExpiredException ex) { MedSavantExceptionHandler.handleSessionExpiredException(ex); return null; } } }; ValueFetcher cFetcher = new ValueFetcher() { @Override public JComponent getValue() throws SQLException, RemoteException { try { return new JLabel(ViewUtil.numToString(MedSavantClient.CohortManager .getCohorts(LoginController.getSessionID(), projectID).length)); } catch (SessionExpiredException ex) { MedSavantExceptionHandler.handleSessionExpiredException(ex); return null; } } }; String key = "Individuals"; kvp.addKey(key); kvp.setValue(key, checkException(key, pFetcher)); key = "Cohorts"; kvp.addKey(key); kvp.setValue(key, checkException(key, cFetcher)); return p; } private JPanel createVariantSummary() { CollapsiblePane p = new CollapsiblePane("Variants"); p.setCollapsible(false); p.getContentPane().setLayout(new BorderLayout()); KeyValuePairPanel kvp = new KeyValuePairPanel(); p.add(kvp, BorderLayout.CENTER); ValueFetcher vfetcher = new ValueFetcher() { @Override public JComponent getValue() throws SQLException, RemoteException { return new JLabel(ViewUtil.numToString(ResultController.getInstance().getTotalVariantCount())); } }; String key = "Variants"; kvp.addKey(key); kvp.setValue(key, checkException(key, vfetcher)); return p; } private JPanel createReferenceSummary() { CollapsiblePane p = new CollapsiblePane("References"); p.setCollapsible(false); p.getContentPane().setLayout(new BorderLayout()); KeyValuePairPanel kvp = new KeyValuePairPanel(); p.add(kvp, BorderLayout.CENTER); ValueFetcher rfetcher = new ValueFetcher() { @Override public JComponent getValue() throws Exception { String[] refs = ReferenceController.getInstance().getReferenceNames(); String s = ""; for (String ref : refs) { s += ref + ", "; } if (s.charAt(s.length() - 1) == ' ') { s = s.substring(0, s.length() - 1); } if (s.charAt(s.length() - 1) == ',') { s = s.substring(0, s.length() - 1); } return new JLabel(s); } }; String key = "References"; kvp.addKey(key); kvp.setValue(key, checkException(key, rfetcher)); key = "Current Reference"; kvp.addKey(key); kvp.setValue(key, ReferenceController.getInstance().getCurrentReferenceName()); return p; } static class Cartouche extends JPanel { private final GridBagConstraints KEY_CONSTRAINTS = new GridBagConstraints(); private final GridBagConstraints VALUE_CONSTRAINTS = new GridBagConstraints(); Cartouche() { setOpaque(false); setLayout(new GridBagLayout()); KEY_CONSTRAINTS.anchor = GridBagConstraints.EAST; KEY_CONSTRAINTS.insets = new Insets(15, 90, 15, 3); VALUE_CONSTRAINTS.gridwidth = GridBagConstraints.REMAINDER; VALUE_CONSTRAINTS.anchor = GridBagConstraints.WEST; VALUE_CONSTRAINTS.insets = new Insets(15, 3, 15, 90); } @Override protected void paintComponent(Graphics g) { super.paintComponent(g); int w = getWidth(); int h = getHeight(); g.setColor(Color.WHITE); g.fillRoundRect(0, 0, w - 1, h - 1, 12, 12); g.setColor(Color.GRAY); g.drawRoundRect(0, 0, w - 1, h - 1, 12, 12); } /** * Add display for a caption and value. Handles exceptions if the ValueFetcher is * doing database access or suchlike. * * @param capt caption text (without trailing colon) * @param fetcher object which fetches the actual value */ void addRow(String capt, ValueFetcher fetcher) { try { add(new JLabel(capt + ":"), KEY_CONSTRAINTS); add(fetcher.getValue(), VALUE_CONSTRAINTS); } catch (Exception ex) { LOG.error("Unable to fetch value for " + capt, ex); add(new JLabel(String.format("<html><font color=\"red\">Unable to fetch value for %s: %s</font>", capt, ClientMiscUtils.getMessage(ex))), VALUE_CONSTRAINTS); } KEY_CONSTRAINTS.insets.top = 0; VALUE_CONSTRAINTS.insets.top = 0; } /** * Add display for a caption and value when the value is just a simple string. * * @param capt caption text (without trailing colon) * @param fetcher object which fetches the actual value */ void addRow(String capt, String val) { if (capt != null) { add(new JLabel(capt + ":"), KEY_CONSTRAINTS); } add(new JLabel(val), VALUE_CONSTRAINTS); KEY_CONSTRAINTS.insets.top = 0; VALUE_CONSTRAINTS.insets.top = 0; } } static abstract class ValueFetcher { abstract JComponent getValue() throws Exception; } }