/* * Scriptographer * * This file is part of Scriptographer, a Scripting Plugin for Adobe Illustrator * http://scriptographer.org/ * * Copyright (c) 2002-2010, Juerg Lehni * http://scratchdisk.com/ * * All rights reserved. See LICENSE file for details. * * File created on May 3, 2010. */ package com.scriptographer.adm; import java.awt.GridLayout; import java.util.EnumSet; import com.scratchdisk.script.Callable; import com.scratchdisk.util.EnumUtils; import com.scriptographer.ScriptographerEngine; import com.scriptographer.adm.layout.HorizontalLayout; import com.scriptographer.ai.FontFamily; import com.scriptographer.ai.FontList; import com.scriptographer.ai.FontWeight; /** * @author lehni * */ public class FontPopupList extends ItemGroup { private FontList fontList; private Item familyItem; private Item weightItem; private PopupList familyList; private PopupList weightList; public FontPopupList(Dialog dialog, EnumSet<FontPopupListOption> options) { super(dialog); fontList = FontList.getInstance(); if (options != null && options.contains(FontPopupListOption.EDITABLE)) { TextEditItem familyEdit = new TextEdit(dialog, new TextOption[] { TextOption.POPUP, TextOption.SCROLLING }) { protected void onChange() { if (updateTextEdit(this) && updateWeightList()) FontPopupList.this.onChange(); } }; familyItem = familyEdit; familyList = familyEdit.getPopupList(); TextEditItem weightEdit = new TextEdit(dialog, new TextOption[] { TextOption.POPUP, TextOption.SCROLLING }) { protected void onChange() { if (updateTextEdit(this)) FontPopupList.this.onChange(); } }; weightItem = weightEdit; weightList = weightEdit.getPopupList(); } else { familyItem = familyList = new PopupList(dialog) { protected void onChange() { if (updateWeightList()) FontPopupList.this.onChange(); } }; weightItem = weightList = new PopupList(dialog){ protected void onChange() { FontPopupList.this.onChange(); } }; } // Add a gap between the components. if (options != null && options.contains(FontPopupListOption.VERTICAL)) { setLayout(new GridLayout(0, 1, 0, 3)); } else { setLayout(new HorizontalLayout(HorizontalLayout.LEFT, 3, 0)); } int width = familyItem.getTextSize(" ").width; familyItem.setWidth(width * 48); weightItem.setWidth(width * 32); add(familyItem); add(weightItem); updateFamilyList(); updateWeightList(); } public FontPopupList(Dialog dialog, FontPopupListOption[] options) { this(dialog, EnumUtils.asSet(options)); } public FontPopupList(Dialog dialog) { this(dialog, (EnumSet<FontPopupListOption>) null); } private void updateFamilyList() { familyList.removeAll(); for (FontFamily family : fontList) { ListEntry entry = new ListEntry(familyList); entry.setText(family.getName()); } familyList.setSelectedEntry(familyList.getFirst()); } private boolean updateWeightList() { // Try to preserve selected weight across fonts: ListEntry selected = weightList.getSelectedEntry(); String current = selected != null ? selected.getText() : null; selected = null; weightList.removeAll(); FontFamily family = getFontFamily(); if (family != null) { for (FontWeight weight : family) { ListEntry entry = new ListEntry(weightList); String name = weight.getName(); entry.setText(name); if (name.equals(current)) selected = entry; } if (selected == null) selected = weightList.getFirst(); weightList.setSelectedEntry(selected); return true; } return false; } protected boolean updateTextEdit(TextEdit textItem) { PopupList list = textItem.getPopupList(); String text = textItem.getText().toLowerCase(); if (list.get(text) == null) { for (ListEntry entry : list) { if (entry.getText().toLowerCase().startsWith(text)) { list.setSelectedEntry(entry); return true; } } } return false; } private Callable onChange = null; protected void onChange() { if (onChange != null) ScriptographerEngine.invoke(onChange, this); } public Callable getOnChange() { return onChange; } public void setOnChange(Callable onChange) { this.onChange = onChange; } public FontFamily getFontFamily() { ListEntry entry = familyList.getSelectedEntry(); if (entry != null) return fontList.get(entry.getText()); return null; } public void setFontFamily(FontFamily family) { ListEntry entry = familyList.get(family.getName()); if (entry != null) { familyList.setSelectedEntry(entry); updateWeightList(); } } public FontWeight getFontWeight() { FontFamily family = getFontFamily(); if (family != null) { ListEntry entry = weightList.getSelectedEntry(); if (entry != null) return family.get(entry.getText()); } return null; } public void setFontWeight(FontWeight weight) { setFontFamily(weight.getFamily()); ListEntry entry = weightList.get(weight.getName()); if (entry != null) weightList.setSelectedEntry(entry); } }