/* * File : TextActivityEditorTextPanel.java * Created : 10-jun-2002 09:59 * By : fbusquets * * JClic - Authoring and playing system for educational activities * * Copyright (C) 2000 - 2005 Francesc Busquets & Departament * d'Educacio de la Generalitat de Catalunya * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program 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 General Public License for more details (see the LICENSE file). */ package edu.xtec.jclic.activities.text; import edu.xtec.jclic.*; import edu.xtec.jclic.beans.ColorButton; import edu.xtec.jclic.beans.SmallIntEditor; import edu.xtec.jclic.boxes.*; import edu.xtec.util.FontCheck; import edu.xtec.util.Messages; import edu.xtec.util.Resizer; import edu.xtec.util.ResizerPanel; import edu.xtec.util.ResourceManager; import edu.xtec.util.SmallButtonBorder; import java.awt.*; import java.util.EventObject; import javax.swing.*; import javax.swing.event.*; import javax.swing.text.*; /** * * @author Francesc Busquets (fbusquets@xtec.cat) * @version 1.0 */ public class TextActivityEditorTextPanel extends ActivityEditorInternalPanel implements Resizer.ResizerListener { //protected boolean loading; protected Resizer resizer; protected boolean skipUpdate; protected String fontName; protected int fontSize; protected boolean changeCombos=true; /** Creates new form MenuEditorPanel */ public TextActivityEditorTextPanel(ActivityEditorPanel parent) { super(parent); initComponents(); textScroll.setBorder(BorderFactory.createEmptyBorder()); textScroll.getVerticalScrollBar().setBorder(BorderFactory.createLineBorder(Color.darkGray, 1)); textPane.addCaretListener(caretListener); resizer=new Resizer(previewPanel, null, false, this); } CaretListener caretListener = new CaretListener() { public void caretUpdate(CaretEvent e) { showAttributes(e.getDot()); } }; /** 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() { java.awt.GridBagConstraints gridBagConstraints; alignGrp = new javax.swing.ButtonGroup(); mainScroll = new javax.swing.JScrollPane(); previewPanel = new PreviewPanel(); textScroll = new javax.swing.JScrollPane(); textPane = new javax.swing.JTextPane(); javax.swing.JTabbedPane ctrlPanel = new javax.swing.JTabbedPane(); javax.swing.JPanel actPanel = new javax.swing.JPanel(); targetBtn = new javax.swing.JToggleButton(); editTargetBtn = new javax.swing.JButton(); insertBoxBtn = new javax.swing.JButton(); prevScreenBtn = new javax.swing.JButton(); optionsBtn = new javax.swing.JButton(); typeBtn = new javax.swing.JButton(); javax.swing.JLabel widthLb = new javax.swing.JLabel(); widthEdit = new edu.xtec.jclic.beans.SmallIntEditor(); javax.swing.JLabel heightLb = new javax.swing.JLabel(); heightEdit = new edu.xtec.jclic.beans.SmallIntEditor(); javax.swing.JPanel stylePanel = new javax.swing.JPanel(); styleBtn = new javax.swing.JButton(); clearStylesBtn = new javax.swing.JButton(); fontFaceCombo = new JComboBox(FontCheck.getFontList(false)); fontSizeCombo = new JComboBox(FontCheck.fontSizes); boldBtn = new javax.swing.JToggleButton(); italicBtn = new javax.swing.JToggleButton(); underlineBtn = new javax.swing.JToggleButton(); alLeftBtn = new javax.swing.JToggleButton(); alCenterBtn = new javax.swing.JToggleButton(); alRightBtn = new javax.swing.JToggleButton(); javax.swing.JLabel textColorLb = new javax.swing.JLabel(); textColorBtn = new edu.xtec.jclic.beans.ColorButton(); textColorBtn.setOptions(options); javax.swing.JLabel bgColorLb = new javax.swing.JLabel(); bgColorBtn = new edu.xtec.jclic.beans.ColorButton(); bgColorBtn.setOptions(options); setLayout(new java.awt.BorderLayout()); previewPanel.setPreferredSize(new java.awt.Dimension(780, 580)); textPane.setPreferredSize(new java.awt.Dimension(Activity.DEFAULT_WIDTH, Activity.DEFAULT_HEIGHT)); textScroll.setViewportView(textPane); previewPanel.add(textScroll); mainScroll.setViewportView(previewPanel); add(mainScroll, java.awt.BorderLayout.CENTER); actPanel.setLayout(new java.awt.GridBagLayout()); targetBtn.setIcon(new javax.swing.ImageIcon(getClass().getResource("/edu/xtec/resources/icons/text_target.gif"))); // NOI18N targetBtn.setToolTipText(options.getMsg("edit_text_act_target_toggle")); targetBtn.setBorder(new SmallButtonBorder(targetBtn, true)); targetBtn.addActionListener(this); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.anchor = java.awt.GridBagConstraints.EAST; gridBagConstraints.insets = new java.awt.Insets(2, 2, 2, 2); actPanel.add(targetBtn, gridBagConstraints); editTargetBtn.setIcon(new javax.swing.ImageIcon(getClass().getResource("/edu/xtec/resources/icons/text_target_edit.gif"))); // NOI18N editTargetBtn.setToolTipText(options.getMsg("edit_text_act_edit_target")); editTargetBtn.setBorder(new SmallButtonBorder(editTargetBtn, true)); editTargetBtn.setEnabled(false); editTargetBtn.addActionListener(this); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST; gridBagConstraints.insets = new java.awt.Insets(2, 2, 2, 8); actPanel.add(editTargetBtn, gridBagConstraints); insertBoxBtn.setIcon(new javax.swing.ImageIcon(getClass().getResource("/edu/xtec/resources/icons/insert_box.gif"))); // NOI18N insertBoxBtn.setToolTipText(options.getMsg("edit_text_act_insertCell")); insertBoxBtn.setBorder(new SmallButtonBorder(prevScreenBtn, true)); insertBoxBtn.addActionListener(this); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.insets = new java.awt.Insets(2, 8, 2, 8); actPanel.add(insertBoxBtn, gridBagConstraints); prevScreenBtn.setIcon(new javax.swing.ImageIcon(getClass().getResource("/edu/xtec/resources/icons/prev_screen.gif"))); // NOI18N prevScreenBtn.setToolTipText(options.getMsg("edit_text_act_prevScreen_title")); prevScreenBtn.setBorder(new SmallButtonBorder(prevScreenBtn, true)); prevScreenBtn.addActionListener(this); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.insets = new java.awt.Insets(2, 8, 2, 8); actPanel.add(prevScreenBtn, gridBagConstraints); optionsBtn.setIcon(new javax.swing.ImageIcon(getClass().getResource("/edu/xtec/resources/icons/check.gif"))); // NOI18N optionsBtn.setToolTipText(options.getMsg("edit_text_act_check_bt")); optionsBtn.setBorder(new SmallButtonBorder(optionsBtn, true)); optionsBtn.addActionListener(this); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.insets = new java.awt.Insets(2, 8, 2, 8); actPanel.add(optionsBtn, gridBagConstraints); typeBtn.setIcon(new javax.swing.ImageIcon(getClass().getResource("/edu/xtec/resources/icons/type.gif"))); // NOI18N typeBtn.setToolTipText(options.getMsg("edit_text_act_typeBtn")); typeBtn.setBorder(new SmallButtonBorder(typeBtn, true)); typeBtn.addActionListener(this); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.insets = new java.awt.Insets(2, 8, 2, 8); actPanel.add(typeBtn, gridBagConstraints); widthLb.setIcon(new javax.swing.ImageIcon(getClass().getResource("/edu/xtec/resources/icons/adjust_width.gif"))); // NOI18N widthLb.setLabelFor(widthEdit); widthLb.setText(":"); widthLb.setIconTextGap(0); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.anchor = java.awt.GridBagConstraints.EAST; gridBagConstraints.insets = new java.awt.Insets(2, 8, 2, 2); actPanel.add(widthLb, gridBagConstraints); widthEdit.setToolTipText(options.getMsg("edit_act_width_tooltip")); widthEdit.setMax(999); widthEdit.setMin(50); widthEdit.addPropertyChangeListener(SmallIntEditor.PROP_VALUE, this); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST; gridBagConstraints.insets = new java.awt.Insets(2, 2, 2, 8); actPanel.add(widthEdit, gridBagConstraints); heightLb.setIcon(new javax.swing.ImageIcon(getClass().getResource("/edu/xtec/resources/icons/adjust_height.gif"))); // NOI18N heightLb.setLabelFor(heightEdit); heightLb.setText(":"); heightLb.setIconTextGap(0); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.anchor = java.awt.GridBagConstraints.EAST; gridBagConstraints.insets = new java.awt.Insets(2, 8, 2, 2); actPanel.add(heightLb, gridBagConstraints); heightEdit.setToolTipText(options.getMsg("edit_act_height_tooltip")); heightEdit.setMax(999); heightEdit.setMin(50); heightEdit.addPropertyChangeListener(SmallIntEditor.PROP_VALUE, this); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST; gridBagConstraints.weightx = 1.0; gridBagConstraints.insets = new java.awt.Insets(2, 2, 2, 8); actPanel.add(heightEdit, gridBagConstraints); ctrlPanel.addTab(options.getMsg("edit_text_act_content"), new javax.swing.ImageIcon(getClass().getResource("/edu/xtec/resources/icons/content.gif")), actPanel); // NOI18N stylePanel.setLayout(new java.awt.GridBagLayout()); styleBtn.setIcon(new javax.swing.ImageIcon(getClass().getResource("/edu/xtec/resources/icons/doc_styles.gif"))); // NOI18N styleBtn.setToolTipText(options.getMsg("edit_text_act_editStylesBtn")); styleBtn.setBorder(new SmallButtonBorder(styleBtn, true)); styleBtn.addActionListener(this); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.insets = new java.awt.Insets(2, 2, 2, 2); stylePanel.add(styleBtn, gridBagConstraints); clearStylesBtn.setIcon(new javax.swing.ImageIcon(getClass().getResource("/edu/xtec/resources/icons/doc_styles_clear.gif"))); // NOI18N clearStylesBtn.setToolTipText(options.getMsg("edit_text_act_clearStylesBtn")); clearStylesBtn.setBorder(new SmallButtonBorder(styleBtn, true)); clearStylesBtn.addActionListener(this); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.insets = new java.awt.Insets(2, 2, 2, 8); stylePanel.add(clearStylesBtn, gridBagConstraints); fontFaceCombo.setEditable(true); fontFaceCombo.setPreferredSize(new java.awt.Dimension(120, fontFaceCombo.getPreferredSize().height)); fontFaceCombo.addActionListener(this); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.insets = new java.awt.Insets(2, 8, 2, 2); stylePanel.add(fontFaceCombo, gridBagConstraints); fontSizeCombo.setEditable(true); fontSizeCombo.setPreferredSize(new java.awt.Dimension(50, fontSizeCombo.getPreferredSize().height)); fontSizeCombo.addActionListener(this); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.insets = new java.awt.Insets(2, 2, 2, 8); stylePanel.add(fontSizeCombo, gridBagConstraints); boldBtn.setIcon(new javax.swing.ImageIcon(getClass().getResource("/edu/xtec/resources/icons/font_bold.gif"))); // NOI18N boldBtn.setToolTipText(options.getMsg("edit_font_bold")); boldBtn.setBorder(new SmallButtonBorder(boldBtn, true)); boldBtn.addActionListener(this); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.insets = new java.awt.Insets(2, 8, 2, 2); stylePanel.add(boldBtn, gridBagConstraints); italicBtn.setIcon(new javax.swing.ImageIcon(getClass().getResource("/edu/xtec/resources/icons/font_italic.gif"))); // NOI18N italicBtn.setToolTipText(options.getMsg("edit_font_italic")); italicBtn.setBorder(new SmallButtonBorder(italicBtn, true)); italicBtn.addActionListener(this); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.insets = new java.awt.Insets(2, 2, 2, 2); stylePanel.add(italicBtn, gridBagConstraints); underlineBtn.setIcon(new javax.swing.ImageIcon(getClass().getResource("/edu/xtec/resources/icons/font_underline.gif"))); // NOI18N underlineBtn.setToolTipText(options.getMsg("edit_font_underline")); underlineBtn.setBorder(new SmallButtonBorder(underlineBtn, true)); underlineBtn.addActionListener(this); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.insets = new java.awt.Insets(2, 2, 2, 8); stylePanel.add(underlineBtn, gridBagConstraints); alignGrp.add(alLeftBtn); alLeftBtn.setIcon(new javax.swing.ImageIcon(getClass().getResource("/edu/xtec/resources/icons/al_left.gif"))); // NOI18N alLeftBtn.setToolTipText(options.getMsg("edit_text_align_left")); alLeftBtn.setBorder(new SmallButtonBorder(alLeftBtn, true)); alLeftBtn.addActionListener(this); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.insets = new java.awt.Insets(2, 8, 2, 2); stylePanel.add(alLeftBtn, gridBagConstraints); alignGrp.add(alCenterBtn); alCenterBtn.setIcon(new javax.swing.ImageIcon(getClass().getResource("/edu/xtec/resources/icons/al_center.gif"))); // NOI18N alCenterBtn.setToolTipText(options.getMsg("edit_text_align_center")); alCenterBtn.setBorder(new SmallButtonBorder(alCenterBtn, true)); alCenterBtn.addActionListener(this); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.insets = new java.awt.Insets(2, 2, 2, 2); stylePanel.add(alCenterBtn, gridBagConstraints); alignGrp.add(alRightBtn); alRightBtn.setIcon(new javax.swing.ImageIcon(getClass().getResource("/edu/xtec/resources/icons/al_right.gif"))); // NOI18N alRightBtn.setToolTipText(options.getMsg("edit_text_align_right")); alRightBtn.setBorder(new SmallButtonBorder(alRightBtn, true)); alRightBtn.addActionListener(this); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.insets = new java.awt.Insets(2, 2, 2, 8); stylePanel.add(alRightBtn, gridBagConstraints); textColorLb.setIcon(new javax.swing.ImageIcon(getClass().getResource("/edu/xtec/resources/icons/fg.gif"))); // NOI18N textColorLb.setText(":"); textColorLb.setIconTextGap(0); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.anchor = java.awt.GridBagConstraints.EAST; gridBagConstraints.insets = new java.awt.Insets(2, 8, 2, 2); stylePanel.add(textColorLb, gridBagConstraints); textColorBtn.setToolTipText(options.getMsg("edit_act_textColor_tooltip")); textColorBtn.addPropertyChangeListener(ColorButton.PROP_COLOR, this); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST; gridBagConstraints.insets = new java.awt.Insets(2, 2, 2, 6); stylePanel.add(textColorBtn, gridBagConstraints); bgColorLb.setIcon(new javax.swing.ImageIcon(getClass().getResource("/edu/xtec/resources/icons/bg.gif"))); // NOI18N bgColorLb.setText(":"); bgColorLb.setIconTextGap(0); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.anchor = java.awt.GridBagConstraints.EAST; gridBagConstraints.insets = new java.awt.Insets(2, 6, 2, 2); stylePanel.add(bgColorLb, gridBagConstraints); bgColorBtn.setToolTipText(options.getMsg("edit_act_bgColor_tooltip")); bgColorBtn.addPropertyChangeListener(ColorButton.PROP_COLOR, this); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST; gridBagConstraints.weightx = 1.0; gridBagConstraints.insets = new java.awt.Insets(2, 2, 2, 2); stylePanel.add(bgColorBtn, gridBagConstraints); ctrlPanel.addTab(options.getMsg("edit_text_act_style"), new javax.swing.ImageIcon(getClass().getResource("/edu/xtec/resources/icons/styles.gif")), stylePanel); // NOI18N add(ctrlPanel, java.awt.BorderLayout.NORTH); }// </editor-fold>//GEN-END:initComponents protected TextActivityBase getTextActivity(){ return (TextActivityBase)getActivity(); } protected TextActivityBaseEditor getTextActivityEditor(){ return (TextActivityBaseEditor)getActivityEditor(); } @Override public void setEnabled(boolean enabled){ super.setEnabled(enabled); textPane.setEnabled(enabled); widthEdit.setEnabled(enabled); heightEdit.setEnabled(enabled); fontFaceCombo.setEnabled(enabled); fontSizeCombo.setEnabled(enabled); boldBtn.setEnabled(enabled); italicBtn.setEnabled(enabled); underlineBtn.setEnabled(enabled); textColorBtn.setEnabled(enabled); bgColorBtn.setEnabled(enabled); targetBtn.setEnabled(enabled); alCenterBtn.setEnabled(enabled); alRightBtn.setEnabled(enabled); alLeftBtn.setEnabled(enabled); resizer.setEnabled(enabled); if(!enabled){ editTargetBtn.setEnabled(false); typeBtn.setEnabled(false); } } private static final Dimension DEFAULT_SIZE=new Dimension(TextActivityBase.DEFAULT_WIDTH, TextActivityBase.DEFAULT_HEIGHT); public void fillData() { TextActivityBaseEditor tabe=getTextActivityEditor(); TextActivityBase act = tabe==null ? null : tabe.getTextActivity(); typeBtn.setEnabled(tabe!=null && tabe.hasType()); DefaultStyledDocument doc = act==null ? new DefaultStyledDocument() : act.tad; // Workaround for JRE 1.4+, part 1: Save a clean copy of the default style attributes Style defaultStyle=doc.getStyle(StyleContext.DEFAULT_STYLE); AttributeSet as=defaultStyle.copyAttributes(); // textPane.setStyledDocument(doc); // // Workaround for JRE 1.4+, part 2: Restore lost attributes defaultStyle.addAttributes(as); doc.addDocumentListener(this); Dimension d = act==null ? DEFAULT_SIZE : act.getWindowSize(); if(act==null || act.tad.getLength()==0) textPane.setBounds(0, 0, d.width, d.height); widthEdit.setValue(d.width); heightEdit.setValue(d.height); textPane.setBackground(act==null ? Color.white : StyleConstants.getBackground(textPane.getStyle(StyleContext.DEFAULT_STYLE))); textScroll.setBounds(0, 0, d.width, d.height); resizer.setRect(textScroll.getBounds()); resizer.setEnabled(act!=null); if(act!=null){ JPanelActiveBox[] boxes=act.tad.getPanelBoxes(); for(int i=0; i<boxes.length; i++){ boxes[i].catchMouseEvents=false; Resizer rs=new Resizer(boxes[i], null, true, this); } javax.swing.SwingUtilities.invokeLater(new Runnable(){ public void run(){ textPane.revalidate(); } }); } } public void resizeObjectTo(Rectangle r, JComponent jc){ if(jc==previewPanel){ TextActivityBase act=getTextActivity(); if(act!=null){ textScroll.setBounds(r.x, r.y, r.width, r.height); act.setWindowSize(textScroll.getSize()); widthEdit.setValue(r.width); heightEdit.setValue(r.height); textScroll.revalidate(); repaint(); setModified(true); } } else if(jc instanceof JPanelActiveBox){ JPanelActiveBox jpab=(JPanelActiveBox)jc; jpab.setBounds(r.x, r.y, r.width, r.height); Dimension d=new Dimension(r.width, r.height); jpab.getActiveBoxContent().setDimension(d); jpab.setPreferredSize(d); jpab.setMaximumSize(d); //jpab.adjustSize(); setModified(true); } } public void editObject(Rectangle r, JComponent jc, Point pt){ if(jc instanceof JPanelActiveBox){ JPanelActiveBox jpab=(JPanelActiveBox)jc; if(jpab.ab!=null){ ActiveBoxContent abc=ActiveBoxContentEditor.getActiveBoxContent( jpab.ab.getContent(), jpab, options, getActivityEditor().getMediaBagEditor(), jpab.ab); if(abc!=null){ jpab.setActiveBoxContent(abc); Dimension d=abc.getDimension(); if(d!=null) resizeObjectTo(new Rectangle(jpab.getX(), jpab.getY(), d.width, d.height), jpab); setModified(true); } } } } public void saveData(){ TextActivityBase act=getTextActivity(); if(act!=null){ // ??? } } protected javax.swing.Icon getIcon(){ return ResourceManager.getImageIcon("icons/text_edit.gif"); } protected String getTitle() { return options.getMsg("edit_act_panels_text"); } protected String getTooltip() { return options.getMsg("edit_act_panels_text_tooltip"); } @Override public boolean documentChangePerformed(DocumentEvent ev){ if(ev!=null && ev.getType()==DocumentEvent.EventType.REMOVE && getTextActivity()!=null) getTextActivity().tad.tmb.removeUnattachedElements(); return ev!=null; } @Override public boolean eventPerformed(EventObject ev){ boolean result=false; TextActivityBaseEditor tabe=getTextActivityEditor(); if(tabe!=null && !skipUpdate){ TextActivityBase ta=tabe.getTextActivity(); MutableAttributeSet attr = new SimpleAttributeSet(); boolean paragraphAttr=false; boolean charAttr=false; boolean replace=false; Object src=(ev==null ? null : ev.getSource()); int xStart = textPane.getSelectionStart(); int xFinish = textPane.getSelectionEnd(); int len=0; if(xStart!=xFinish){ if(xFinish<xStart){ int s=xStart; xStart=xFinish; xFinish=s; } len=xFinish-xStart; } if(src!=null && src.equals(fontFaceCombo)){ fontName = fontFaceCombo.getSelectedItem().toString(); StyleConstants.setFontFamily(attr, fontName); charAttr=true; } else if(src!=null && src.equals(fontSizeCombo)){ int fs; try{ fs=Integer.parseInt(fontSizeCombo.getSelectedItem().toString()); } catch(NumberFormatException ex){ return false; } if(fs>=1){ fontSize=fs; StyleConstants.setFontSize(attr, fontSize); charAttr=true; } } else if(src==boldBtn){ StyleConstants.setBold(attr, boldBtn.isSelected()); charAttr=true; } else if(src==italicBtn){ StyleConstants.setItalic(attr, italicBtn.isSelected()); charAttr=true; } else if(src==underlineBtn){ StyleConstants.setUnderline(attr, underlineBtn.isSelected()); charAttr=true; } else if(src==textColorBtn){ StyleConstants.setForeground(attr, textColorBtn.getColor()); charAttr=true; } else if(src==targetBtn){ boolean b=targetBtn.isSelected(); TargetMarker tm = b ? createNewTarget() : ta.tad.tmb.getElementByOffset(xFinish, true); if(tm==null) return false; if(!b && !deleteTarget(tm)) return true; textPane.setCaretPosition(xStart); SwingUtilities.invokeLater(new Runnable(){ public void run(){ showAttributes(-1); } }); } else if(tabe.canEditTarget() && src==editTargetBtn){ tabe.editTarget(xFinish, options, this); //if(tabe.editTarget(xFinish, options, this)) // setModified(true); } else if(src==insertBoxBtn){ JPanelActiveBox jpab=tabe.createNewBox(xStart, options, this); if(jpab!=null){ jpab.catchMouseEvents=false; Resizer rs=new Resizer(jpab, null, true, this); } } else if(src==optionsBtn){ tabe.editCheckOptions(options, this); } else if(src==typeBtn && tabe.hasType()){ tabe.editType(options, this); } else if(src==bgColorBtn){ if(len==0){ } else{ StyleConstants.setBackground(attr, bgColorBtn.getColor()); charAttr=true; } } else if(src==alLeftBtn || src==alCenterBtn || src==alRightBtn){ int align = src==alCenterBtn ? StyleConstants.ALIGN_CENTER : src==alRightBtn ? StyleConstants.ALIGN_RIGHT : StyleConstants.ALIGN_LEFT; StyleConstants.setAlignment(attr, align); paragraphAttr=true; } else if(src==styleBtn){ StyleContext sc=TextStyleEditorPanel.editStyleContext(options, ta.tad.styleContext, this); if(sc!=null){ try{ ta.setStyleContext(sc); setInitializing(true); fillData(); setInitializing(false); } catch(Exception ex){ System.err.println("error applying styles:\n"+ex); } } } else if(src==clearStylesBtn){ int d=options.getMessages().showQuestionDlg(this, "edit_text_act_clearStylesPrompt", null, "yn"); if(d==Messages.YES) try{ ta.setTextActivityDocument(ta.tad.getJDomElementWithoutStyles()); setInitializing(true); fillData(); setInitializing(false); } catch(Exception ex) { System.err.println("Error cleaning styles:\n"+ex); } } else if(src==prevScreenBtn){ if(TextPrevScreenEditorPanel.editPrevScreen(options, (TextActivityBaseEditor)getActivityEditor(), this)) setModified(true); } else if(src==widthEdit || src==heightEdit){ ta.setWindowSize(new Dimension(widthEdit.getValue(), heightEdit.getValue())); previewPanel.revalidate(); } changeCombos=false; if (paragraphAttr) ta.tad.setParagraphAttributes(xStart, len, attr, replace); if(charAttr){ if(len>0) ta.tad.setCharacterAttributes(xStart, len, attr, replace); else { MutableAttributeSet inputAttributes=textPane.getInputAttributes(); inputAttributes.addAttributes(attr); } } textPane.grabFocus(); changeCombos=true; result=true; } return result; } protected TargetMarker createNewTarget(){ TargetMarker result=null; TextActivityBaseEditor tabe=getTextActivityEditor(); if(tabe!=null){ int from=textPane.getSelectionStart(); int to=textPane.getSelectionEnd(); result=tabe.createNewTarget(from, to, options, this); } return result; } protected boolean deleteTarget(TargetMarker tm){ boolean result=false; TextActivityBaseEditor tabe=getTextActivityEditor(); if(tabe!=null) result=tabe.deleteTarget(tm, options, this); return result; } protected void showAttributes(int p) { TextActivityBaseEditor tabe=getTextActivityEditor(); if(tabe!=null){ TextActivityBase ta=tabe.getTextActivity(); skipUpdate = true; if(p<0) p=Math.max(0, textPane.getCaretPosition()); AttributeSet a = ta.tad.getCharacterElement(p).getAttributes(); String name = StyleConstants.getFontFamily(a); if(!name.equals(fontName) && changeCombos) { fontName = name; fontFaceCombo.setSelectedItem(name); } int size = StyleConstants.getFontSize(a); if (fontSize!=size && changeCombos) { fontSize = size; fontSizeCombo.setSelectedItem(Integer.toString(fontSize)); } boldBtn.setSelected(StyleConstants.isBold(a)); italicBtn.setSelected(StyleConstants.isItalic(a)); underlineBtn.setSelected(StyleConstants.isUnderline(a)); Color c=StyleConstants.getForeground(a); if(!c.equals(textColorBtn.getColor())) textColorBtn.setColor(c); c=StyleConstants.getBackground(a); if(!c.equals(bgColorBtn.getColor())) bgColorBtn.setColor(c); targetBtn.setSelected(a.isDefined(TextActivityDocument.TARGET)); editTargetBtn.setEnabled(tabe.canEditTarget() && a.isDefined(TextActivityDocument.TARGET)); int alignment=StyleConstants.getAlignment(a); alCenterBtn.setSelected(alignment==StyleConstants.ALIGN_CENTER); alRightBtn.setSelected(alignment==StyleConstants.ALIGN_RIGHT); alLeftBtn.setSelected(alignment!=StyleConstants.ALIGN_RIGHT && alignment!=StyleConstants.ALIGN_CENTER); skipUpdate = false; } } // Variables declaration - do not modify//GEN-BEGIN:variables private javax.swing.JToggleButton alCenterBtn; private javax.swing.JToggleButton alLeftBtn; private javax.swing.JToggleButton alRightBtn; private javax.swing.ButtonGroup alignGrp; private edu.xtec.jclic.beans.ColorButton bgColorBtn; private javax.swing.JToggleButton boldBtn; private javax.swing.JButton clearStylesBtn; private javax.swing.JButton editTargetBtn; private javax.swing.JComboBox fontFaceCombo; private javax.swing.JComboBox fontSizeCombo; private edu.xtec.jclic.beans.SmallIntEditor heightEdit; private javax.swing.JButton insertBoxBtn; private javax.swing.JToggleButton italicBtn; private javax.swing.JScrollPane mainScroll; private javax.swing.JButton optionsBtn; private javax.swing.JButton prevScreenBtn; private javax.swing.JPanel previewPanel; private javax.swing.JButton styleBtn; private javax.swing.JToggleButton targetBtn; private edu.xtec.jclic.beans.ColorButton textColorBtn; private javax.swing.JTextPane textPane; private javax.swing.JScrollPane textScroll; private javax.swing.JButton typeBtn; private javax.swing.JToggleButton underlineBtn; private edu.xtec.jclic.beans.SmallIntEditor widthEdit; // End of variables declaration//GEN-END:variables protected class PreviewPanel extends ResizerPanel{ @Override public void doLayout(){ if(textScroll!=null){ TextActivityBase act=getTextActivity(); Dimension d=(act!=null ? act.getWindowSize() : new Dimension(Activity.DEFAULT_WIDTH, Activity.DEFAULT_HEIGHT)); textScroll.setBounds(0, 0, d.width, d.height); } } } }