OmegaT の背景に画像を表示します。
背景処理用のパッケージ effect/ を追加し、処理を imageLoader から ThemeChanger に移動
| @@ -32,6 +32,7 @@ | ||
| 32 | 32 | import java.util.Map; |
| 33 | 33 | import java.util.Set; |
| 34 | 34 | import java.util.TreeSet; |
| 35 | +import jp.sourceforge.users.yutang.omegat.plugin.moenizer.effect.Effect; | |
| 35 | 36 | import org.omegat.util.Log; |
| 36 | 37 | |
| 37 | 38 | /** |
| @@ -43,9 +44,6 @@ | ||
| 43 | 44 | |
| 44 | 45 | static final String FILE_NAME = "config.groovy"; |
| 45 | 46 | |
| 46 | - public enum ProviderType { | |
| 47 | - Color, SimpleImage | |
| 48 | - } | |
| 49 | 47 | private final String KEY_INDEX = "index"; |
| 50 | 48 | private final String KEY_ISACTIVE = "isActive"; |
| 51 | 49 |
| @@ -151,9 +149,7 @@ | ||
| 151 | 149 | } |
| 152 | 150 | |
| 153 | 151 | ConfigObject effect = new ConfigObject(); |
| 154 | - effect.put("type", ProviderType.SimpleImage.name()); | |
| 155 | - effect.put("target", "mainWindow"); | |
| 156 | - effect.put("opacity", 0.5f); // 0.0f (Transparent) <--> 1.0f (Opaque) | |
| 152 | + effect.put("type", Effect.Type.SimpleImage.name()); | |
| 157 | 153 | effect.put("image", image); |
| 158 | 154 | |
| 159 | 155 | List<ConfigObject> effects = new ArrayList<ConfigObject>(1); |
| @@ -16,7 +16,6 @@ | ||
| 16 | 16 | |
| 17 | 17 | package jp.sourceforge.users.yutang.omegat.plugin.moenizer; |
| 18 | 18 | |
| 19 | -import groovy.util.ConfigObject; | |
| 20 | 19 | import java.awt.image.BufferedImage; |
| 21 | 20 | import java.util.concurrent.TimeUnit; |
| 22 | 21 | import javax.swing.SwingUtilities; |
| @@ -68,16 +67,13 @@ | ||
| 68 | 67 | try { |
| 69 | 68 | CoreEvents.registerProjectChangeListener(this); |
| 70 | 69 | |
| 71 | - ui = null; | |
| 72 | 70 | config = new MoeConfig(MoeUtil.getMoeConfigFile()); |
| 73 | - imageLoader = ImageLoader.getInstance(config.getCurrentConfig()); | |
| 74 | 71 | // この時点ではまだウィンドウがインスタンス化されていないので、 |
| 75 | 72 | // ウィンドウに対する処理は少し待つ。 |
| 76 | 73 | |
| 77 | - (new SlideShow()).execute(); | |
| 78 | - | |
| 79 | 74 | ui = MoeUI.getInstance(); |
| 80 | - themeChanger = new ThemeChanger(config.getCurrentConfig()); | |
| 75 | + themeChanger = new ThemeChanger(ui); | |
| 76 | + themeChanger.setTheme(config.getCurrentConfig()); | |
| 81 | 77 | |
| 82 | 78 | // この時点でコンポーネントの透過設定をしても反映されない(タイミング?)。 |
| 83 | 79 | // Workaround として、invokeLater でキューに突っ込んで、後で処理する。 |
| @@ -85,7 +81,6 @@ | ||
| 85 | 81 | @Override |
| 86 | 82 | public void run() { |
| 87 | 83 | CoreEvents.unregisterApplicationEventListener(Moenizer.this); |
| 88 | - ui.transparent(); | |
| 89 | 84 | themeChanger.apply(); |
| 90 | 85 | } |
| 91 | 86 | }); |
| @@ -111,7 +106,7 @@ | ||
| 111 | 106 | @Override |
| 112 | 107 | public void run() { |
| 113 | 108 | CoreEvents.unregisterProjectChangeListener(Moenizer.this); |
| 114 | - ui.transparentEditor(); | |
| 109 | + ui.transparentEditor(); //@@TODO これは effect の方から指定をもらわないと | |
| 115 | 110 | } |
| 116 | 111 | }); |
| 117 | 112 |
| @@ -17,6 +17,11 @@ | ||
| 17 | 17 | package jp.sourceforge.users.yutang.omegat.plugin.moenizer; |
| 18 | 18 | |
| 19 | 19 | import groovy.util.ConfigObject; |
| 20 | +import java.util.List; | |
| 21 | +import java.util.Map; | |
| 22 | +import jp.sourceforge.users.yutang.omegat.plugin.moenizer.effect.Effect; | |
| 23 | +import jp.sourceforge.users.yutang.omegat.plugin.moenizer.effect.IEffect; | |
| 24 | +import org.omegat.util.Log; | |
| 20 | 25 | |
| 21 | 26 | /** |
| 22 | 27 | * |
| @@ -24,21 +29,41 @@ | ||
| 24 | 29 | */ |
| 25 | 30 | public class ThemeChanger { |
| 26 | 31 | |
| 27 | - private ConfigObject config; | |
| 32 | + private MoeUI model = null; | |
| 33 | + private ConfigObject theme = null; | |
| 28 | 34 | |
| 29 | - public ThemeChanger(ConfigObject config) { | |
| 30 | - this.config = config; | |
| 35 | + public ThemeChanger(MoeUI ui) { | |
| 36 | + this.model = ui; | |
| 31 | 37 | } |
| 32 | 38 | |
| 39 | + public void setTheme(ConfigObject theme) { | |
| 40 | + this.theme = theme; | |
| 41 | + | |
| 42 | + // check constraints | |
| 43 | + //@@TODO 整合性チェック。たとえば、mainWindow 対象の処理が複数ある、など | |
| 44 | + } | |
| 45 | + | |
| 33 | 46 | public void apply() { |
| 34 | - if (config == null) { | |
| 47 | + // no theme, no effects | |
| 48 | + if (theme == null || !theme.containsKey("effects")) { //@@TODO literal to const | |
| 35 | 49 | return; |
| 36 | 50 | } |
| 37 | 51 | |
| 38 | - | |
| 39 | - | |
| 40 | - | |
| 41 | - | |
| 42 | - | |
| 52 | + // get effect list (ArrayList) | |
| 53 | + List<ConfigObject> effects = (List<ConfigObject>) theme.get("effects"); //@@TODO literal to const | |
| 54 | + if (effects.isEmpty()) { | |
| 55 | + return; | |
| 56 | + } | |
| 57 | + | |
| 58 | + // apply effects | |
| 59 | + for (Map conf: effects) { | |
| 60 | + String type = (String) conf.get("type"); | |
| 61 | + try { | |
| 62 | + IEffect effect = Effect.create(Effect.Type.valueOf(type), conf); | |
| 63 | + effect.invoke(model); | |
| 64 | + } catch (Exception ex) { | |
| 65 | + Log.log("Error on ThemeChanger#apply(): " + ex.getMessage()); | |
| 66 | + } | |
| 67 | + } | |
| 43 | 68 | } |
| 44 | 69 | } |
| @@ -0,0 +1,29 @@ | ||
| 1 | +/************************************************************************** | |
| 2 | + Moenizer - Allow to set background image for OmegaT. | |
| 3 | + | |
| 4 | + Copyright (C) 2014 Yu Tang | |
| 5 | + Home page: http://sourceforge.jp/users/yu-tang/ | |
| 6 | + Support center: http://sourceforge.jp/users/yu-tang/pf/Moenizer/ | |
| 7 | + | |
| 8 | + This file is part of plugin for OmegaT. | |
| 9 | + http://www.omegat.org/ | |
| 10 | + | |
| 11 | + License: GNU GPL version 3 or (at your option) any later version. | |
| 12 | + | |
| 13 | + You should have received a copy of the GNU General Public License | |
| 14 | + along with this program. If not, see <http://www.gnu.org/licenses/>. | |
| 15 | + **************************************************************************/ | |
| 16 | + | |
| 17 | +package jp.sourceforge.users.yutang.omegat.plugin.moenizer.effect; | |
| 18 | + | |
| 19 | +import jp.sourceforge.users.yutang.omegat.plugin.moenizer.MoeUI; | |
| 20 | + | |
| 21 | +/** | |
| 22 | + * | |
| 23 | + * @author Yu-Tang | |
| 24 | + */ | |
| 25 | +public interface IEffect { | |
| 26 | + | |
| 27 | + public void invoke(MoeUI ui); | |
| 28 | + | |
| 29 | +} |
| @@ -0,0 +1,47 @@ | ||
| 1 | +/** | |
| 2 | + * ************************************************************************ | |
| 3 | + * Moenizer - Allow to set background image for OmegaT. | |
| 4 | + * | |
| 5 | + * Copyright (C) 2014 Yu Tang Home page: http://sourceforge.jp/users/yu-tang/ | |
| 6 | + * Support center: http://sourceforge.jp/users/yu-tang/pf/Moenizer/ | |
| 7 | + * | |
| 8 | + * This file is part of plugin for OmegaT. http://www.omegat.org/ | |
| 9 | + * | |
| 10 | + * License: GNU GPL version 3 or (at your option) any later version. | |
| 11 | + * | |
| 12 | + * You should have received a copy of the GNU General Public License along with | |
| 13 | + * this program. If not, see <http://www.gnu.org/licenses/>. | |
| 14 | + ************************************************************************* | |
| 15 | + */ | |
| 16 | +package jp.sourceforge.users.yutang.omegat.plugin.moenizer.effect; | |
| 17 | + | |
| 18 | +import groovy.util.ConfigObject; | |
| 19 | +import java.lang.reflect.Constructor; | |
| 20 | +import java.util.Map; | |
| 21 | + | |
| 22 | +/** | |
| 23 | + * static method only | |
| 24 | + * | |
| 25 | + * @author Yu-Tang | |
| 26 | + */ | |
| 27 | +public class Effect { | |
| 28 | + | |
| 29 | + private Effect() { | |
| 30 | + // prevent instantiation | |
| 31 | + } | |
| 32 | + | |
| 33 | + public enum Type { | |
| 34 | + SimpleImage | |
| 35 | + } | |
| 36 | + | |
| 37 | + public static IEffect create(Type type, Map conf) throws Exception { | |
| 38 | + final String CLASS_NAME = Effect.class.getPackage().getName() + "." + type.name(); | |
| 39 | + Class<? extends IEffect> clazz = (Class<? extends IEffect>) Class.forName(CLASS_NAME); | |
| 40 | + Class<?>[] types = {Map.class}; | |
| 41 | + Constructor<? extends IEffect> constructor = clazz.getConstructor(types); | |
| 42 | + Object[] args = {conf}; | |
| 43 | + IEffect newInstance = constructor.newInstance(args); | |
| 44 | + return newInstance; | |
| 45 | + } | |
| 46 | + | |
| 47 | +} |
| @@ -0,0 +1,112 @@ | ||
| 1 | +/************************************************************************** | |
| 2 | + Moenizer - Allow to set background image for OmegaT. | |
| 3 | + | |
| 4 | + Copyright (C) 2014 Yu Tang | |
| 5 | + Home page: http://sourceforge.jp/users/yu-tang/ | |
| 6 | + Support center: http://sourceforge.jp/users/yu-tang/pf/Moenizer/ | |
| 7 | + | |
| 8 | + This file is part of plugin for OmegaT. | |
| 9 | + http://www.omegat.org/ | |
| 10 | + | |
| 11 | + License: GNU GPL version 3 or (at your option) any later version. | |
| 12 | + | |
| 13 | + You should have received a copy of the GNU General Public License | |
| 14 | + along with this program. If not, see <http://www.gnu.org/licenses/>. | |
| 15 | + **************************************************************************/ | |
| 16 | + | |
| 17 | +package jp.sourceforge.users.yutang.omegat.plugin.moenizer.effect; | |
| 18 | + | |
| 19 | +import groovy.util.ConfigObject; | |
| 20 | +import java.io.File; | |
| 21 | +import java.io.IOException; | |
| 22 | +import java.net.MalformedURLException; | |
| 23 | +import java.net.URL; | |
| 24 | +import java.util.ArrayList; | |
| 25 | +import java.util.List; | |
| 26 | +import java.util.Map; | |
| 27 | +import java.util.logging.Level; | |
| 28 | +import java.util.logging.Logger; | |
| 29 | +import javax.imageio.ImageIO; | |
| 30 | +import jp.sourceforge.users.yutang.omegat.plugin.moenizer.MoeUI; | |
| 31 | +import org.omegat.util.Log; | |
| 32 | + | |
| 33 | +/** | |
| 34 | + * | |
| 35 | + * @author Yu-Tang | |
| 36 | + */ | |
| 37 | +public class SimpleImage implements IEffect { | |
| 38 | + | |
| 39 | + private final String KEY_TARGET = "target"; | |
| 40 | + private final String KEY_OPACITY = "opacity"; | |
| 41 | + private final String KEY_IMAGE = "image"; | |
| 42 | + private final String KEY_EXCEPTIONS = "exceptions"; | |
| 43 | + | |
| 44 | + private String target = "mainWindow"; | |
| 45 | + private float opacity = 0.5f; | |
| 46 | + private String image = ""; | |
| 47 | + private List<String> exceptions = new ArrayList<String>(); | |
| 48 | + | |
| 49 | + public SimpleImage(Map config) { | |
| 50 | + if (config.containsKey(KEY_TARGET)) { | |
| 51 | + target = (String) config.get(KEY_TARGET); | |
| 52 | + if (!target.equals("mainWindow")) { | |
| 53 | + //@@TODO 他のtargetにも対応 | |
| 54 | + throw new IllegalArgumentException( | |
| 55 | + "target argument '" + target + "' is not supported."); | |
| 56 | + } | |
| 57 | + } | |
| 58 | + | |
| 59 | + if (config.containsKey(KEY_OPACITY)) { | |
| 60 | + opacity = (Float) config.get(KEY_OPACITY); | |
| 61 | + } | |
| 62 | + | |
| 63 | + if (config.containsKey(KEY_IMAGE)) { | |
| 64 | + image = (String) config.get(KEY_IMAGE); | |
| 65 | + } | |
| 66 | + | |
| 67 | + if (config.containsKey(KEY_EXCEPTIONS)) { | |
| 68 | + exceptions = (List<String>) config.get(KEY_EXCEPTIONS); | |
| 69 | + } | |
| 70 | + } | |
| 71 | + | |
| 72 | + @Override | |
| 73 | + public void invoke(MoeUI ui) { | |
| 74 | + if (image.isEmpty()) { | |
| 75 | + return; | |
| 76 | + } | |
| 77 | + | |
| 78 | + if (exceptions.contains("menubar")) { | |
| 79 | + ui.setMakeTransparentMenubar(false); | |
| 80 | + } | |
| 81 | + | |
| 82 | + if (exceptions.contains("statusbar")) { | |
| 83 | + ui.setMakeTransparentStatusbar(false); | |
| 84 | + } | |
| 85 | + | |
| 86 | + if (exceptions.contains("buttonpanel")) { | |
| 87 | + ui.setMakeTransparentButtonPanel(false); | |
| 88 | + } | |
| 89 | + | |
| 90 | + if (exceptions.contains("panetitlebar")) { | |
| 91 | + ui.setMakeTransparentPaneTitlebar(false); | |
| 92 | + } | |
| 93 | + | |
| 94 | + String lcased = image.toLowerCase(); | |
| 95 | + try { | |
| 96 | + if (lcased.startsWith("http://") || lcased.startsWith("https://")) { | |
| 97 | + ui.setBackground(ImageIO.read(new URL(image))); | |
| 98 | + } else { | |
| 99 | + ui.setBackground(ImageIO.read(new File(image))); | |
| 100 | + } | |
| 101 | + } catch (MalformedURLException ex) { | |
| 102 | + Log.log(ex.getMessage()); | |
| 103 | + } catch (IOException ex) { | |
| 104 | + Log.log(ex.getMessage()); | |
| 105 | + } | |
| 106 | + | |
| 107 | + ui.transparent(); | |
| 108 | + //@@TODO transparentEditor | |
| 109 | + //@@TODO opacity | |
| 110 | + } | |
| 111 | + | |
| 112 | +} |