package org.korsakow.ide.ui.laf; import java.io.InputStream; import javax.swing.BorderFactory; import javax.swing.ImageIcon; import javax.swing.UIDefaults; import javax.swing.border.BevelBorder; import javax.swing.plaf.basic.BasicLookAndFeel; import org.apache.log4j.Logger; import org.korsakow.ide.Application; import org.korsakow.ide.util.Platform; import org.korsakow.ide.util.ResourceManager; import org.korsakow.ide.util.UIResourceManager; import com.sun.java.swing.plaf.motif.MotifFileChooserUI; import com.sun.java.swing.plaf.motif.MotifLookAndFeel; import com.sun.java.swing.plaf.motif.MotifTreeCellRenderer; public class KorsakowLookAndFeel extends BasicLookAndFeel { @Override public UIDefaults getDefaults() { UIDefaults defaults = new UIDefaults(); initClassDefaults(defaults); initSystemColorDefaults(defaults); super.initComponentDefaults(defaults); KorsakowDefaultKeybindings.installKeybindings(defaults); LafProperties lafProperties = null; try { InputStream inputStream; inputStream = ResourceManager.getResourceStream("laf.xml"); lafProperties = new LafProperties(inputStream); lafProperties.installColors(defaults); } catch (Exception e) { Logger.getLogger(Application.class).error("", e); } try { if (lafProperties != null) lafProperties.installComponents(defaults, lafProperties.getDefaultValues()); } catch (Exception e) { Logger.getLogger(Application.class).error("", e); } initComponentDefaults(defaults); return defaults; } // Enumeration e = faults.keys(); // TreeSet set = new TreeSet(); // while (e.hasMoreElements()) { // Object item = e.nextElement(); // if (!item.toString().endsWith("UI")) // set.add(e.nextElement()); // } // for (Object item : set) // System.out.println(item +" " + faults.get(item)); // return faults; // } @Override protected void initClassDefaults(UIDefaults table) { table.put("Panel.opaque", false); // UIDefaults def = UIManager.getLookAndFeelDefaults(); // Enumeration e = def.keys(); // while (e.hasMoreElements()) { // Object item = e.nextElement(); // if (item.toString().endsWith("UI")) // System.out.println(item +" " + def.get(item)); // } super.initClassDefaults(table); String korsakowPackageName = "org.korsakow.ide.ui.laf."; String motifPackageName = "com.sun.java.swing.plaf.motif."; String basicPackageName = "javax.swing.plaf.basic."; Object[] uiDefaults = { "ButtonUI", korsakowPackageName + "KorsakowButtonUI", "CheckBoxUI", korsakowPackageName + "KorsakowCheckBoxUI", // "DirectoryPaneUI", motifPackageName + "MotifDirectoryPaneUI", "FileChooserUI", MotifFileChooserUI.class.getCanonicalName(), "LabelUI", korsakowPackageName + "KorsakowLabelUI", // "MenuBarUI", korsakowPackageName + "MotifMenuBarUI", // "MenuUI", korsakowPackageName + "MotifMenuUI", "MenuItemUI", korsakowPackageName + "KorsakowMenuItemUI", // "CheckBoxMenuItemUI", korsakowPackageName + "MotifCheckBoxMenuItemUI", // "RadioButtonMenuItemUI", korsakowPackageName + "MotifRadioButtonMenuItemUI", "RadioButtonUI", korsakowPackageName + "KorsakowRadioButtonUI", "ToggleButtonUI", korsakowPackageName + "KorsakowToggleButtonUI", // "ToggleButtonUI", korsakowPackageName + "MotifToggleButtonUI", // "PopupMenuUI", korsakowPackageName + "MotifPopupMenuUI", // "ProgressBarUI", korsakowPackageName + "MotifProgressBarUI", // "ScrollBarUI", korsakowPackageName + "MotifScrollBarUI", // "ScrollPaneUI", korsakowPackageName + "MotifScrollPaneUI", "SliderUI", korsakowPackageName + "KorsakowSliderUI", // "SplitPaneUI", korsakowPackageName + "MotifSplitPaneUI", "TabbedPaneUI", korsakowPackageName + "KorsakowTabbedPaneUI", "TreeUI", korsakowPackageName + "KorsakowTreeUI", // "TextAreaUI", korsakowPackageName + "MotifTextAreaUI", "TableHeaderUI", korsakowPackageName + "KorsakowTableHeaderUI", "TableUI", korsakowPackageName + "KorsakowTableUI", "ListUI", korsakowPackageName + "KorsakowListUI", // "PanelUI", korsakowPackageName + "KorsakowPanelUI", "CollapsiblePaneHeaderUI", korsakowPackageName + "KorsakowCollapsiblePaneHeaderUI", "TextFieldUI", korsakowPackageName + "KorsakowTextFieldUI", // "PasswordFieldUI", korsakowPackageName + "MotifPasswordFieldUI", // "TextPaneUI", korsakowPackageName + "MotifTextPaneUI", // "EditorPaneUI", korsakowPackageName + "MotifEditorPaneUI", // "TreeUI", korsakowPackageName + "MotifTreeUI", // "InternalFrameUI", korsakowPackageName + "MotifInternalFrameUI", // "DesktopPaneUI", korsakowPackageName + "MotifDesktopPaneUI", // "SeparatorUI", korsakowPackageName + "MotifSeparatorUI", // "PopupMenuSeparatorUI", korsakowPackageName + "MotifPopupMenuSeparatorUI", // "OptionPaneUI", korsakowPackageName + "MotifOptionPaneUI", "ComboBoxUI", korsakowPackageName + "KorsakowComboBoxUI", // "DesktopIconUI", korsakowPackageName + "MotifDesktopIconUI" "RootPaneUI", korsakowPackageName + "KorsakowRootPaneUI", }; table.putDefaults(uiDefaults); } /** */ @Override protected void initSystemColorDefaults(UIDefaults table) { super.initSystemColorDefaults(table); String[] defaultSystemColors = { "window2", "#424242", /* Default color for the interior of windows */ // "activeCaption", "#000080", /* Color for captions (title bars) when they are active. */ // "activeCaptionText", "#FFFFFF", /* Text color for text in captions (title bars). */ // "activeCaptionBorder", "#B24D7A", /* Border color for caption (title bar) window borders. */ // "inactiveCaption", "#AEB2C3", /* Color for captions (title bars) when not active. */ // "inactiveCaptionText", "#000000", /* Text color for text in inactive captions (title bars). */ // "inactiveCaptionBorder", "#AEB2C3", /* Border color for inactive caption (title bar) window borders. */ // "window", "#AEB2C3", /* Default color for the interior of windows */ // "windowBorder", "#AEB2C3", /* ??? */ // "windowText", "#000000", /* ??? */ // "menu", "#AEB2C3", /* ??? */ // "menuText", "#000000", /* ??? */ // "text", "#FFFFFF", /* Text background color */ // "textText", "#000000", /* Text foreground color */ // "textHighlight", "#000000", /* Text background color when selected */ // "textHighlightText", "#FFF7E9", /* Text color when selected */ // "textInactiveText", "#808080", /* Text color when disabled */ // "control", "#ff0000", /* Default color for controls (buttons, sliders, etc) */ // "controlText", "#000000", /* Default color for text in controls */ // "controlHighlight", "#DCDEE5", /* Highlight color for controls */ // "controlLtHighlight", "#DCDEE5", /* Light highlight color for controls */ // "controlShadow", "#63656F", /* Shadow color for controls */ // "controlLightShadow", "#9397A5", /* Shadow color for controls */ // "controlDkShadow", "#000000", /* Dark shadow color for controls */ // "scrollbar", "#AEB2C3", /* Scrollbar ??? color. PENDING(jeff) foreground? background? ?*/ // "info", "#FFF7E9", /* ??? */ // "infoText", "#000000" /* ??? */ }; // AWT SystemColors only for for CDE on JDK1.2 loadSystemColors(table, defaultSystemColors, false/*is1dot2*/); } @Override protected void initComponentDefaults(UIDefaults table) { // super.initComponentDefaults(table); table.put("ComboBox.border", null); // table.put("MenuBar.border", BorderFactory.createLineBorder(table.getColor("MenuBar.borderColor"), table.getInt("MenuBar.borderSize"))); table.put("Button.border", BorderFactory.createCompoundBorder(BorderFactory.createBevelBorder(BevelBorder.RAISED), BorderFactory.createEmptyBorder(2, 3, 2, 3))); table.put("ToggleButton.border", BorderFactory.createCompoundBorder(BorderFactory.createBevelBorder(BevelBorder.RAISED), BorderFactory.createEmptyBorder(2, 3, 2, 3))); table.put("ProgressBar.border", BorderFactory.createEtchedBorder()); table.put("TableHeader.cellBorder", BorderFactory.createLineBorder(table.getColor("TableHeader.borderColor"), table.getInt("TableHeader.borderSize"))); // table.put("Table.cellBorder", null); table.put("Table.focusCellHighlightBorder", null); table.put("Tree.openIcon", new ImageIcon(MotifLookAndFeel.class.getResource("icons/TreeOpen.gif"))); table.put("Tree.closedIcon", new ImageIcon(MotifLookAndFeel.class.getResource("icons/TreeClosed.gif"))); table.put("Tree.leafIcon", new UIDefaults.LazyValue() { public Object createValue(UIDefaults table) { return MotifTreeCellRenderer.loadLeafIcon(); } }); // table.put("Tree.openIcon", new UIDefaults.LazyValue() { public Object createValue(UIDefaults table) { return UIResourceManager.getIcon("folder.png"); } }); // table.put("Tree.closedIcon", new UIDefaults.LazyValue() { public Object createValue(UIDefaults table) { return UIResourceManager.getIcon("folder.png"); } }); table.put("Tree.expandedIcon", new UIDefaults.LazyValue() { public Object createValue(UIDefaults table) { return UIResourceManager.getIcon("arrow_down.png"); } }); table.put("Tree.collapsedIcon", new UIDefaults.LazyValue() { public Object createValue(UIDefaults table) { return UIResourceManager.getIcon("arrow_right.png"); } }); // this doesn't compeltely fix it. KeyEvent.getmodifierskeytext has the + hardcoded! if (Platform.isMacOS()) table.put("MenuItem.acceleratorDelimiter", ""); } @Override public String getDescription() { return "Korsakow Look And Feel"; } @Override public String getID() { return "KorsakowLookAndFeel"; } @Override public String getName() { return "KorsakowLookAndFeel"; } @Override public boolean isNativeLookAndFeel() { return false; } @Override public boolean isSupportedLookAndFeel() { return true; } }