Package com.ibm.richtext.swingui

Source Code of com.ibm.richtext.swingui.JObjectDialog

/*
* (C) Copyright IBM Corp. 1998-2007.  All Rights Reserved.
*
* The program is provided "as is" without any warranty express or
* implied, including the warranty of non-infringement and the implied
* warranties of merchantibility and fitness for a particular purpose.
* IBM will not be liable for any damages suffered by you as a result
* of using the Program. In no event will IBM be liable for any
* special, indirect or consequential damages or lost profits even if
* IBM has been advised of the possibility of their occurrence. IBM
* will not be liable for any third party claims against you.
*/
package com.ibm.richtext.swingui;

import java.util.Hashtable;

import javax.swing.Box;
import javax.swing.BorderFactory;
import javax.swing.BoxLayout;
import javax.swing.JDialog;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JButton;
import javax.swing.JList;
import javax.swing.JLabel;
import javax.swing.ListSelectionModel;

import javax.swing.event.ListSelectionEvent;
import javax.swing.event.ListSelectionListener;

import java.awt.BorderLayout;
import java.awt.Container;
import java.awt.Dimension;
import java.awt.Frame;
import java.awt.FlowLayout;

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseAdapter;
import java.awt.event.WindowEvent;
import java.awt.event.WindowAdapter;

import com.ibm.richtext.textlayout.attributes.AttributeSet;
import com.ibm.richtext.styledtext.MConstText;
import com.ibm.richtext.styledtext.StyleModifier;
import com.ibm.richtext.textpanel.MTextPanel;
import com.ibm.richtext.uiimpl.MenuItemSet;

import com.ibm.richtext.uiimpl.resources.FrameResources;
import com.ibm.richtext.uiimpl.ResourceUtils;

/**
* Simple dialog that sets an attribute.
*/
final class JObjectDialog extends JDialog {

    /**
     * For serialization
     */
    private static final long serialVersionUID = -9183651131772308979L;
    //static final String COPYRIGHT =
    //            "(C) Copyright IBM Corp. 1998-1999 - All Rights Reserved";

    private final MTextPanel fTextPanel;
    private final Object fKey;
    private boolean fCharacter;
    private Hashtable fNameToValueMap;
   
    private final JButton fOKButton;
    private final JButton fCancelButton;
    private final JList fItems;
   
    /**
    * Construct a new JObjectDialog.
    * @param parent the dialog's parent frame
    * @param title the dialogs title
    * @param message the message displayed next to the input box
    */
    JObjectDialog(Frame parent,
                  String title,
                  String message,
                  MTextPanel textPanel,
                  Object key,
                  boolean character,
                  String[] names,
                  Object[] values) {
                   
        super(parent, title, false);

        setupMap(names, values);
       
        Dimension size = new Dimension(250, 200);
       
        fTextPanel = textPanel;
        fKey = key;
        fCharacter = character;
       
        fItems = new JList(names);
        fItems.setSelectionMode(ListSelectionModel.MULTIPLE_INTERVAL_SELECTION);
       
        fItems.addMouseListener(new MouseAdapter() {
            public void mouseClicked(MouseEvent e) {
                if (e.getClickCount() == 2) {
                    closeWindow(true);
                }
            }
        });
       
        JScrollPane listScroller = new JScrollPane(fItems);
        listScroller.setPreferredSize(size);
        listScroller.setPreferredSize(size);
        listScroller.setAlignmentX(LEFT_ALIGNMENT);

        JLabel label = new JLabel(message);
        label.setLabelFor(fItems);
       
        JPanel itemPanel = new JPanel();
        itemPanel.add(label);
        itemPanel.add(Box.createRigidArea(new Dimension(0,5)));
        itemPanel.add(listScroller);
        itemPanel.setBorder(BorderFactory.createEmptyBorder(10,10,10,10));
       
        itemPanel.setLayout(new BoxLayout(itemPanel, BoxLayout.Y_AXIS));
       
        fCancelButton = new JButton(ResourceUtils.getResourceString(FrameResources.CANCEL));
        fOKButton = new JButton(ResourceUtils.getResourceString(FrameResources.OK));
       
        JPanel buttonPanel = new JPanel();
        buttonPanel.setLayout(new FlowLayout(FlowLayout.CENTER, 5, 5));
        buttonPanel.add(fCancelButton);
        buttonPanel.add(fOKButton);
       
        Container content = getContentPane();
        content.add(itemPanel, BorderLayout.CENTER);
        content.add(buttonPanel, BorderLayout.SOUTH);

        pack();

        addWindowListener(new WindowAdapter() {
            public void windowClosing(WindowEvent e) {
                closeWindow(false);
            }
        });
       
        ActionListener listener = new ActionListener() {
            public void actionPerformed(ActionEvent e) {
           
                Object source = e.getSource();
                if (source == fOKButton) {
                    closeWindow(true);
                }
                else if (source == fCancelButton) {
                    closeWindow(false);
                }
            }
        };
       
        fOKButton.addActionListener(listener);
        fCancelButton.addActionListener(listener);
       
        selectStyles(values);
    }
   
    private void setupMap(String[] names, Object[] values) {
   
        if (names.length != values.length) {
            throw new IllegalArgumentException("Must have same number of names and values.");
        }
       
        fNameToValueMap = new Hashtable(names.length);
       
        for (int i=0; i < names.length; i++) {
            if (values[i] != null) {
                fNameToValueMap.put(names[i], values[i]);
            }
        }

    }

    private void closeWindow(boolean sendAction) {

        setVisible(false);
       
        if (sendAction && fItems.getMinSelectionIndex() != fItems.getMaxSelectionIndex()) {
            sendAction = false;
        }
       
        if (sendAction) {
            Object value = fNameToValueMap.get(fItems.getSelectedValue());
            sendAction(value);
        }
        dispose();
    }

    /**
    * Handle the user input
    * @param value The value object
    */
    private void sendAction(Object value) {

        StyleModifier modifier;
        if (value != null) {
            modifier = StyleModifier.createAddModifier(fKey, value);
        }
        else {
            AttributeSet set = new AttributeSet(fKey);
            modifier = StyleModifier.createRemoveModifier(set);
        }

        if (fCharacter == MenuItemSet.CHARACTER) {
            fTextPanel.modifyCharacterStyleOnSelection(modifier);
        }
        else {
            fTextPanel.modifyParagraphStyleOnSelection(modifier);
        }
    }
   
    private void selectValue(Object value, Object[] values) {
   
        for (int i=0; i < values.length; i++) {
       
            if ((value != null && value.equals(values[i])) || (value == null && values[i] == null)) {
                fItems.addSelectionInterval(i, i);
                fItems.ensureIndexIsVisible(i);
                return;
            }
        }
    }
   
    private void selectStyles(Object[] values) {
   
        Object value;
        if (fCharacter) {
            value = fTextPanel.getCharacterStyleOverSelection(fKey);
        }
        else {
            value = fTextPanel.getParagraphStyleOverSelection(fKey);
        }
       
        if (value != MTextPanel.MULTIPLE_VALUES) {
            selectValue(value, values);
        }
        else {
            fOKButton.setEnabled(false);
           
            int selLimit = fTextPanel.getSelectionEnd();
            MConstText text = fTextPanel.getText();
            for (int runStart = fTextPanel.getSelectionStart(); runStart <= selLimit;
                    runStart = fCharacter? text.characterStyleLimit(runStart) :
                                           text.paragraphLimit(runStart)) {
           
                Object runVal;
                if (fCharacter) {
                    runVal = text.characterStyleAt(runStart).get(fKey);
                }
                else {
                    runVal = text.paragraphStyleAt(runStart).get(fKey);
                }
                if (runVal == null) {
                    runVal = fTextPanel.getDefaultValues().get(fKey);
                }
               
                selectValue(runVal, values);
                if (runStart == text.length()) {
                    break;
                }
            }
        }
       
        fItems.addListSelectionListener(new ListSelectionListener() {
            public void valueChanged(ListSelectionEvent e) {
                fItems.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
                fOKButton.setEnabled(true);
                fItems.removeListSelectionListener(this);
            }
        });
    }
}
TOP

Related Classes of com.ibm.richtext.swingui.JObjectDialog

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.