1 17 package org.columba.mail.gui.composer.html; 18 19 import java.awt.Component ; 20 import java.awt.event.ActionEvent ; 21 import java.awt.event.ActionListener ; 22 import java.util.logging.Logger ; 23 24 import javax.swing.BorderFactory ; 25 import javax.swing.Box ; 26 import javax.swing.DefaultListCellRenderer ; 27 import javax.swing.JComboBox ; 28 import javax.swing.JList ; 29 import javax.swing.JToolBar ; 30 import javax.swing.UIManager ; 31 import javax.swing.text.html.HTML ; 32 33 import org.columba.api.gui.frame.IFrameMediator; 34 import org.columba.api.plugin.IExtension; 35 import org.columba.api.plugin.IExtensionHandler; 36 import org.columba.api.plugin.IExtensionHandlerKeys; 37 import org.columba.api.plugin.PluginException; 38 import org.columba.api.plugin.PluginHandlerNotFoundException; 39 import org.columba.core.gui.action.AbstractColumbaAction; 40 import org.columba.core.gui.action.AbstractSelectableAction; 41 import org.columba.core.gui.base.LabelWithMnemonic; 42 import org.columba.core.gui.base.RoundedBorder; 43 import org.columba.core.gui.toolbar.ToggleToolbarButton; 44 import org.columba.core.logging.Logging; 45 import org.columba.core.plugin.PluginManager; 46 import org.columba.mail.gui.composer.ComposerController; 47 import org.columba.mail.gui.composer.ComposerModelChangedEvent; 48 import org.columba.mail.gui.composer.IComposerModelChangedListener; 49 import org.columba.mail.gui.composer.html.action.FontSizeMenu; 50 import org.columba.mail.gui.composer.html.action.ParagraphMenu; 51 import org.columba.mail.util.MailResourceLoader; 52 import org.frapuccino.htmleditor.api.IFormatChangedListener; 53 import org.frapuccino.htmleditor.event.FormatChangedEvent; 54 import org.frapuccino.htmleditor.event.FormatInfo; 55 56 61 public class HtmlToolbar extends JToolBar implements ActionListener , 62 IFormatChangedListener, IComposerModelChangedListener { 63 64 65 private static final Logger LOG = Logger 66 .getLogger("org.columba.mail.gui.composer.html"); 67 68 private ComposerController controller; 69 70 private JComboBox paragraphComboBox; 71 72 private JComboBox sizeComboBox; 73 74 78 private boolean ignoreFormatAction = false; 79 80 private IExtensionHandler handler = null; 81 82 85 public HtmlToolbar(ComposerController controller) { 86 super(); 87 this.controller = controller; 88 89 setBorder(BorderFactory.createCompoundBorder(new RoundedBorder( 90 UIManager.getColor("controlShadow")), BorderFactory 91 .createEmptyBorder(4, 4, 4, 4))); 92 93 setRollover(true); 94 95 setFloatable(false); 96 97 try { 98 handler = PluginManager.getInstance().getExtensionHandler( 99 IExtensionHandlerKeys.ORG_COLUMBA_CORE_ACTION); 100 } catch (PluginHandlerNotFoundException e) { 101 e.printStackTrace(); 102 } 103 104 try { 105 initComponents(); 106 } catch (Exception e) { 107 e.printStackTrace(); 108 } 109 110 ((HtmlEditorController2) controller.getHtmlEditorController()) 111 .addFormatChangedListener(this); 112 113 116 119 controller.getModel().addModelChangedListener(this); 121 122 } 132 133 protected void initComponents() throws Exception { 134 136 138 paragraphComboBox = new JComboBox (ParagraphMenu.STYLE_TAGS); 139 paragraphComboBox.setRenderer(new ParagraphTagRenderer()); 140 paragraphComboBox.setActionCommand("PARA"); 141 paragraphComboBox.addActionListener(this); 142 paragraphComboBox.setFocusable(false); 143 144 LabelWithMnemonic sizeLabel = new LabelWithMnemonic(MailResourceLoader 145 .getString("dialog", "composer", "size")); 146 sizeComboBox = new JComboBox (FontSizeMenu.SIZES); 147 sizeComboBox.setActionCommand("SIZE"); 148 sizeComboBox.addActionListener(this); 149 sizeComboBox.setSelectedIndex(2); 150 sizeComboBox.setFocusable(false); 151 152 159 161 sizeComboBox.setEnabled(false); 164 165 ToggleToolbarButton boldFormatButton = new ToggleToolbarButton( 166 (AbstractSelectableAction) getAction("BoldFormatAction", 167 getFrameController())); 168 ToggleToolbarButton italicFormatButton = new ToggleToolbarButton( 169 (AbstractSelectableAction) getAction("ItalicFormatAction", 170 getFrameController())); 171 ToggleToolbarButton underlineFormatButton = new ToggleToolbarButton( 172 (AbstractSelectableAction) getAction("UnderlineFormatAction", 173 getFrameController())); 174 ToggleToolbarButton strikeoutFormatButton = new ToggleToolbarButton( 175 (AbstractSelectableAction) getAction("StrikeoutFormatAction", 176 getFrameController())); 177 ToggleToolbarButton leftJustifyButton = new ToggleToolbarButton( 178 (AbstractSelectableAction) getAction("LeftJustifyAction", 179 getFrameController())); 180 ToggleToolbarButton centerJustifyButton = new ToggleToolbarButton( 181 (AbstractSelectableAction) getAction("CenterJustifyAction", 182 getFrameController())); 183 ToggleToolbarButton rightJustifyButton = new ToggleToolbarButton( 184 (AbstractSelectableAction) getAction("RightJustifyAction", 185 getFrameController())); 186 187 189 add(paragraphComboBox); 190 addSeparator(); 191 add(sizeLabel); 192 add(sizeComboBox); 193 addSeparator(); 194 195 add(boldFormatButton); 196 add(italicFormatButton); 197 add(underlineFormatButton); 198 add(strikeoutFormatButton); 199 addSeparator(); 200 add(leftJustifyButton); 201 add(centerJustifyButton); 202 add(rightJustifyButton); 203 204 add(Box.createHorizontalGlue()); 205 225 } 227 228 231 public ComposerController getFrameController() { 232 return controller; 233 } 234 235 243 284 private void selectInParagraphComboBox(HTML.Tag tag) { 285 ignoreFormatAction = true; 288 289 paragraphComboBox.setSelectedItem(tag); 290 291 ignoreFormatAction = false; 293 } 294 295 300 public void actionPerformed(ActionEvent arg0) { 301 String action = arg0.getActionCommand(); 302 303 if (action.equals("PARA")) { 304 if (!ignoreFormatAction) { 306 HtmlEditorController2 ctrl = (HtmlEditorController2) getFrameController() 308 .getCurrentEditor(); 309 310 int selectedIndex = paragraphComboBox.getSelectedIndex(); 312 HTML.Tag tag = ParagraphMenu.STYLE_TAGS[selectedIndex]; 313 314 LOG.fine("Setting paragraph format to: " + tag.toString()); 315 316 ctrl.setParagraphFormat(tag); 317 } 318 } else if (action.equals("SIZE")) { 319 321 } 323 } 324 325 342 346 protected static class ParagraphTagRenderer extends DefaultListCellRenderer { 347 public Component getListCellRendererComponent(JList list, Object value, 348 int index, boolean selected, boolean hasFocus) { 349 return super.getListCellRendererComponent(list, MailResourceLoader 350 .getString("menu", "composer", "menu_format_paragraph_" 351 + value.toString()), index, selected, hasFocus); 352 } 353 } 354 355 private AbstractColumbaAction getAction(String id, IFrameMediator controller) { 356 if (id == null) 357 throw new IllegalArgumentException ("id == null"); 358 if (controller == null) 359 throw new IllegalArgumentException ("controller == null"); 360 361 IExtension extension = handler.getExtension(id); 362 363 AbstractColumbaAction a = null; 364 365 try { 366 if (extension != null) 367 a = (AbstractColumbaAction) extension 368 .instanciateExtension(new Object [] { controller }); 369 } catch (PluginException e) { 370 LOG.severe(e.getMessage()); 371 if (Logging.DEBUG) 372 e.printStackTrace(); 373 374 } 375 376 return a; 377 378 } 379 380 public void formatChanged(FormatChangedEvent event) { 383 384 FormatInfo info = event.getInfo(); 385 386 if (info.isHeading1()) { 387 selectInParagraphComboBox(HTML.Tag.H1); 388 } else if (info.isHeading2()) { 389 selectInParagraphComboBox(HTML.Tag.H2); 390 } else if (info.isHeading3()) { 391 selectInParagraphComboBox(HTML.Tag.H3); 392 } else if (info.isPreformattet()) { 393 selectInParagraphComboBox(HTML.Tag.PRE); 394 } else if (info.isAddress()) { 395 selectInParagraphComboBox(HTML.Tag.ADDRESS); 396 } else { 397 selectInParagraphComboBox(HTML.Tag.P); 399 } 400 } 401 402 public void htmlModeChanged(ComposerModelChangedEvent event) { 404 paragraphComboBox.setEnabled(event.isHtmlEnabled()); 405 sizeComboBox.setEnabled(event.isHtmlEnabled()); 406 } 407 408 public void modelChanged(ComposerModelChangedEvent event) { 409 } 410 } 411 | Popular Tags |