package open.dolphin.impl.scheam; import java.awt.Point; import java.awt.Rectangle; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import open.dolphin.impl.scheam.schemahelper.SchemaTitleBorder; /** * * @author pns */ public class SchemaCanvasView extends javax.swing.JFrame { private SchemaToolView toolView; private SchemaCanvasView canvasView; public SchemaCanvasView() { initComponents(); initTitlePanel(); // toolView が後ろに行った場合,canvas をクリックすると toFront されるようにする this.getRootPane().addMouseListener(new MouseAdapter(){ @Override public void mouseClicked(MouseEvent e) { toolView.toFront(); } }); } /** * JFrame を undecorated にして * titlePanel をつかんで移動できるようにする */ private void initTitlePanel() { canvasView = this; TitlePanelListener l = new TitlePanelListener(); titlePanel.addMouseListener(l); titlePanel.addMouseMotionListener(l); titlePanel.setBorder(new SchemaTitleBorder()); titleLabel.setText(SchemaEditorImpl.TITLE); } /** * toolView に近づいたらくっつける,くっついたら一緒に動く */ private class TitlePanelListener extends MouseAdapter implements Runnable { private Point from; private int THRESHOLD = 16; private boolean attached; @Override public void mousePressed(MouseEvent e) { toolView.toFront(); from = e.getLocationOnScreen(); attached = false; } @Override public void mouseDragged(MouseEvent e) { Point to = e.getLocationOnScreen(); int dx = to.x - from.x; int dy = to.y - from.y; Rectangle toolRect = toolView.getBounds(); Rectangle canvasRect = canvasView.getBounds(); int dxTcL = toolRect.x + toolRect.width - canvasRect.x; int dxTcR = canvasRect.x + canvasRect.width - toolRect.x; // 近づいたらくっつける動作 if ((-THRESHOLD < dxTcL && dxTcL < THRESHOLD) || (-THRESHOLD < dxTcR && dxTcR < THRESHOLD)) { attached = true; } canvasView.setBounds(canvasRect.x + dx, canvasRect.y + dy, canvasRect.width, canvasRect.height); new Thread(this).start(); from.x = to.x; from.y = to.y; } @Override public void run() { Rectangle toolRect = toolView.getBounds(); Rectangle canvasRect = canvasView.getBounds(); if (attached) { if (toolRect.x < canvasRect.x) { // toolView が左にある場合 toolRect.x = canvasRect.x - toolRect.width - 2; } else { // toolView が右にある場合 toolRect.x = canvasRect.x + canvasRect.width + 2; } toolView.setBounds(toolRect.x, canvasRect.y, toolRect.width, toolRect.height); } } } public void setSchemaToolView(SchemaToolView view) { toolView = view; } public javax.swing.JPanel getTitlePanel() { return titlePanel; } public javax.swing.JButton getCancelBtn() { return cancelBtn; } public javax.swing.JPanel getCanvasPanel() { return canvasPanel; } public javax.swing.JButton getOkBtn() { return okBtn; } public javax.swing.JComboBox getRoleCombo() { return roleCombo; } public javax.swing.JTextField getTitleFld() { return titleFld; } /** This method is called from within the constructor to * initialize the form. * WARNING: Do NOT modify this code. The content of this method is * always regenerated by the Form Editor. */ // <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents private void initComponents() { canvasPanel = new javax.swing.JPanel(); jLabel1 = new javax.swing.JLabel(); titleFld = new javax.swing.JTextField(); jLabel2 = new javax.swing.JLabel(); roleCombo = new javax.swing.JComboBox(); okBtn = new javax.swing.JButton(); cancelBtn = new javax.swing.JButton(); titlePanel = new javax.swing.JPanel(); titleLabel = new javax.swing.JLabel(); setDefaultCloseOperation(javax.swing.WindowConstants.DO_NOTHING_ON_CLOSE); setAlwaysOnTop(true); setUndecorated(true); setResizable(false); canvasPanel.setBackground(new java.awt.Color(255, 255, 255)); canvasPanel.setPreferredSize(new java.awt.Dimension(100, 150)); java.util.ResourceBundle bundle = java.util.ResourceBundle.getBundle("open/dolphin/impl/scheam/resources/SchemaCanvasView"); // NOI18N jLabel1.setText(bundle.getString("titleLabel.text")); // NOI18N jLabel2.setText(bundle.getString("usageLabel.text")); // NOI18N roleCombo.setModel(new javax.swing.DefaultComboBoxModel(new String[] { "Laboratory specimen test", "Endoscope test", "Simple X-ray", "Upper gastrointestinal tract test", "Barium enema test", "CT scan", "MRI", "RI image test", "Angiography", "Other radiological tests", "Echo", "Electrocardiography", "Electroencephalography", "Electromyography", "Phonocardiography", "Pulmonary function test", "Other physiological tests", "Prescription", "Vital sign table", "Physical findings (e.g. chart))", "Anesthesia record table", "Pathological test (e.g. image)", "Surgical record figure", "Reference document", "Reference figure", "Treatment (instruction, record, etc.)", "Items other than the above" })); okBtn.setText(bundle.getString("okBtn.text")); // NOI18N okBtn.setSelected(true); cancelBtn.setText(bundle.getString("cancelBtn.text.discard")); // NOI18N titleLabel.setFont(new java.awt.Font("Lucida Grande", 0, 9)); // NOI18N titleLabel.setHorizontalAlignment(javax.swing.SwingConstants.CENTER); titleLabel.setText(bundle.getString("editorTitleLabel.text")); // NOI18N titleLabel.setMaximumSize(new java.awt.Dimension(10000, 16)); titleLabel.setMinimumSize(new java.awt.Dimension(72, 16)); titleLabel.setPreferredSize(new java.awt.Dimension(72, 16)); javax.swing.GroupLayout titlePanelLayout = new javax.swing.GroupLayout(titlePanel); titlePanel.setLayout(titlePanelLayout); titlePanelLayout.setHorizontalGroup( titlePanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addComponent(titleLabel, javax.swing.GroupLayout.Alignment.TRAILING, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) ); titlePanelLayout.setVerticalGroup( titlePanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addComponent(titleLabel, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) ); javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane()); getContentPane().setLayout(layout); layout.setHorizontalGroup( layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addComponent(titlePanel, javax.swing.GroupLayout.Alignment.TRAILING, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) .addGroup(layout.createSequentialGroup() .addContainerGap() .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup() .addGap(0, 92, Short.MAX_VALUE) .addComponent(jLabel1) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addComponent(titleFld, javax.swing.GroupLayout.PREFERRED_SIZE, 456, javax.swing.GroupLayout.PREFERRED_SIZE)) .addGroup(layout.createSequentialGroup() .addComponent(jLabel2) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addComponent(roleCombo, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) .addComponent(cancelBtn) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addComponent(okBtn, javax.swing.GroupLayout.PREFERRED_SIZE, 98, javax.swing.GroupLayout.PREFERRED_SIZE)) .addComponent(canvasPanel, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)) .addContainerGap()) ); layout.setVerticalGroup( layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addGroup(layout.createSequentialGroup() .addComponent(titlePanel, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) .addComponent(jLabel1, javax.swing.GroupLayout.PREFERRED_SIZE, 28, javax.swing.GroupLayout.PREFERRED_SIZE) .addComponent(titleFld, javax.swing.GroupLayout.PREFERRED_SIZE, 30, javax.swing.GroupLayout.PREFERRED_SIZE)) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addComponent(canvasPanel, javax.swing.GroupLayout.DEFAULT_SIZE, 367, Short.MAX_VALUE) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) .addComponent(jLabel2, javax.swing.GroupLayout.PREFERRED_SIZE, 28, javax.swing.GroupLayout.PREFERRED_SIZE) .addComponent(roleCombo, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) .addComponent(okBtn) .addComponent(cancelBtn))) ); pack(); }// </editor-fold>//GEN-END:initComponents // Variables declaration - do not modify//GEN-BEGIN:variables private javax.swing.JButton cancelBtn; private javax.swing.JPanel canvasPanel; private javax.swing.JLabel jLabel1; private javax.swing.JLabel jLabel2; private javax.swing.JButton okBtn; private javax.swing.JComboBox roleCombo; private javax.swing.JTextField titleFld; private javax.swing.JLabel titleLabel; private javax.swing.JPanel titlePanel; // End of variables declaration//GEN-END:variables }