• R/O
  • SSH
  • HTTPS

Commit

Frequently used words (click to add to your profile)

javac++androidlinuxc#windowsobjective-ccocoa誰得qtpythonphprubygameguibathyscaphec計画中(planning stage)翻訳omegatframeworktwitterdomtestvb.netdirectxゲームエンジンbtronarduinopreviewer

OmegaT の背景に画像を表示します。


Commit MetaInfo

Revision52 (tree)
Time2014-05-24 14:11:02
Authoryu-tang

Log Message

不透明度の指定対象をメインウィンドウのみに制限
詳細については、チケット #50238 のコメントを参照

Change Summary

Incremental Difference

--- trunk/src/jp/sourceforge/users/yutang/omegat/plugin/moenizer/IMoeUI.java (revision 51)
+++ trunk/src/jp/sourceforge/users/yutang/omegat/plugin/moenizer/IMoeUI.java (nonexistent)
@@ -1,35 +0,0 @@
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;
18-
19-import java.awt.Color;
20-import java.awt.image.BufferedImage;
21-
22-/**
23- *
24- * @author Yu-Tang
25- */
26-public interface IMoeUI {
27- public void setBackground(BufferedImage image);
28-
29- public void setBackground(Color color);
30-
31- public void setMarginTop(int marginTop);
32-
33- public void setOpacity(float opacity);
34-
35-}
--- trunk/src/jp/sourceforge/users/yutang/omegat/plugin/moenizer/MoeUIDelegator.java (revision 51)
+++ trunk/src/jp/sourceforge/users/yutang/omegat/plugin/moenizer/MoeUIDelegator.java (revision 52)
@@ -34,17 +34,18 @@
3434 private BufferedImage tiledImage = null;
3535 private Color bgColor = null;
3636 private JComponent component = null;
37- private final float DEFAULT_ALPHA = 0.5f;
37+ private final float DEFAULT_ALPHA = MoeUI.OPACITY_HALF;
3838 private float alpha = DEFAULT_ALPHA;
39- private AlphaComposite alphaComposite = null;
39+ private AlphaComposite alphaComposite = getAlphaComposite(alpha);
4040 private int marginTop = 0;
4141
4242 public void setOpacity(float opacity) {
4343 this.alpha = opacity;
44- this.alphaComposite = getAlphaComposite(opacity);
44+ this.alphaComposite = opacity >= MoeUI.OPACITY_OPAQUE ?
45+ null : getAlphaComposite(opacity);
4546 }
4647
47- public void setBackground(BufferedImage image) {
48+ public void setBackgroundImage(BufferedImage image) {
4849 this.image = image;
4950
5051 if (component == null) {
@@ -55,10 +56,18 @@
5556 }
5657 }
5758
58- public void setBackground(Color color) {
59+ public void setBackgroundColor(Color color) {
5960 this.bgColor = color;
6061 }
6162
63+ public BufferedImage getBackgroundImage() {
64+ return image;
65+ }
66+
67+ public Color getBackgroundColor() {
68+ return bgColor;
69+ }
70+
6271 public void setComponent(JComponent c) {
6372 // change transparent component to opaque
6473 if (!c.isOpaque()) {
--- trunk/src/jp/sourceforge/users/yutang/omegat/plugin/moenizer/MoeRootPaneUI.java (revision 51)
+++ trunk/src/jp/sourceforge/users/yutang/omegat/plugin/moenizer/MoeRootPaneUI.java (revision 52)
@@ -39,7 +39,7 @@
3939 *
4040 * @author Yu-Tang
4141 */
42-public class MoeRootPaneUI extends BasicRootPaneUI implements IMoeUI {
42+public class MoeRootPaneUI extends BasicRootPaneUI implements IMoePaneUI {
4343
4444 private MoeUIDelegator uiDelegator = null;
4545
@@ -56,21 +56,30 @@
5656 }
5757
5858 @Override
59- public void setBackground(BufferedImage image) {
60- uiDelegator.setBackground(image);
59+ public BufferedImage getBackgroundImage() {
60+ return uiDelegator.getBackgroundImage();
6161 }
6262
6363 @Override
64- public void setBackground(Color color) {
65- uiDelegator.setBackground(color);
64+ public void setBackgroundImage(BufferedImage image) {
65+ uiDelegator.setBackgroundImage(image);
6666 }
6767
6868 @Override
69+ public Color getBackgroundColor() {
70+ return uiDelegator.getBackgroundColor();
71+ }
72+
73+ @Override
74+ public void setBackgroundColor(Color color) {
75+ uiDelegator.setBackgroundColor(color);
76+ }
77+
78+ @Override
6979 public void setMarginTop(int marginTop) {
7080 uiDelegator.setMarginTop(marginTop);
7181 }
7282
73- @Override
7483 public void setOpacity(float opacity) {
7584 uiDelegator.setOpacity(opacity);
7685 }
--- trunk/src/jp/sourceforge/users/yutang/omegat/plugin/moenizer/MoeTextPaneUI.java (revision 51)
+++ trunk/src/jp/sourceforge/users/yutang/omegat/plugin/moenizer/MoeTextPaneUI.java (revision 52)
@@ -26,7 +26,7 @@
2626 *
2727 * @author Yu-Tang
2828 */
29-public class MoeTextPaneUI extends BasicTextPaneUI implements IMoeUI {
29+public class MoeTextPaneUI extends BasicTextPaneUI implements IMoePaneUI {
3030
3131 private MoeUIDelegator uiDelegator = null;
3232
@@ -33,6 +33,11 @@
3333 public MoeTextPaneUI() {
3434 super();
3535 uiDelegator = new MoeUIDelegator();
36+
37+ // MoeTextPaneUI は個別ペイン用の UI なので、仕様上の制約により不透明度
38+ // を設定できません(1.0f 固定 = 不透明)。そのため、ここで固定値を設定
39+ // して、setter を空実装にしておきます。
40+ uiDelegator.setOpacity(MoeUI.OPACITY_OPAQUE);
3641 }
3742
3843 @Override
@@ -43,28 +48,39 @@
4348 }
4449
4550 @Override
46- public void setBackground(BufferedImage image) {
47- uiDelegator.setBackground(image);
51+ public BufferedImage getBackgroundImage() {
52+ return uiDelegator.getBackgroundImage();
4853 }
4954
5055 @Override
51- public void setBackground(Color color) {
52- uiDelegator.setBackground(color);
56+ public void setBackgroundImage(BufferedImage image) {
57+ uiDelegator.setBackgroundImage(image);
5358 }
5459
5560 @Override
56- public void setMarginTop(int marginTop) {
57- uiDelegator.setMarginTop(marginTop);
61+ public Color getBackgroundColor() {
62+ return uiDelegator.getBackgroundColor();
5863 }
5964
6065 @Override
61- public void setOpacity(float opacity) {
62- uiDelegator.setOpacity(opacity);
66+ public void setBackgroundColor(Color color) {
67+ uiDelegator.setBackgroundColor(color);
6368 }
6469
6570 @Override
71+ public void setMarginTop(int marginTop) {
72+ uiDelegator.setMarginTop(marginTop);
73+ }
74+
75+ @Override
6676 protected void paintBackground(Graphics g) {
6777 uiDelegator.paintBackground(g);
6878 }
6979
80+ public MoeTextPaneUI clone() {
81+ MoeTextPaneUI ui = new MoeTextPaneUI();
82+ ui.setBackgroundImage(uiDelegator.getBackgroundImage());
83+ ui.setBackgroundColor(uiDelegator.getBackgroundColor());
84+ return ui;
85+ }
7086 }
--- trunk/src/jp/sourceforge/users/yutang/omegat/plugin/moenizer/IMoePaneUI.java (nonexistent)
+++ trunk/src/jp/sourceforge/users/yutang/omegat/plugin/moenizer/IMoePaneUI.java (revision 52)
@@ -0,0 +1,36 @@
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;
18+
19+import java.awt.Color;
20+import java.awt.image.BufferedImage;
21+
22+/**
23+ *
24+ * @author Yu-Tang
25+ */
26+public interface IMoePaneUI {
27+ public BufferedImage getBackgroundImage();
28+
29+ public void setBackgroundImage(BufferedImage image);
30+
31+ public Color getBackgroundColor();
32+
33+ public void setBackgroundColor(Color color);
34+
35+ public void setMarginTop(int marginTop);
36+}
--- trunk/src/jp/sourceforge/users/yutang/omegat/plugin/moenizer/effect/BasicEffect.java (revision 51)
+++ trunk/src/jp/sourceforge/users/yutang/omegat/plugin/moenizer/effect/BasicEffect.java (revision 52)
@@ -91,9 +91,7 @@
9191
9292 ui.setOpacity(target, opacity);
9393
94- if (target == Parts.MainWindow) {
95- ui.transparent(excludeParts);
96- }
94+ ui.transparent(target, excludeParts);
9795 }
9896
9997 }
--- trunk/src/jp/sourceforge/users/yutang/omegat/plugin/moenizer/MoeUI.java (revision 51)
+++ trunk/src/jp/sourceforge/users/yutang/omegat/plugin/moenizer/MoeUI.java (revision 52)
@@ -43,9 +43,11 @@
4343 import javax.swing.JTextPane;
4444 import javax.swing.SwingUtilities;
4545 import javax.swing.plaf.ComponentUI;
46+import javax.swing.text.Highlighter;
4647 import org.omegat.core.Core;
4748 import org.omegat.core.CoreEvents;
4849 import org.omegat.core.events.IProjectEventListener;
50+import org.omegat.util.Log;
4951 import org.omegat.util.gui.UIThreadsUtil;
5052
5153 /**
@@ -53,9 +55,12 @@
5355 * @author Yu-Tang
5456 */
5557 public class MoeUI implements IProjectEventListener {
56-
58+
59+ public static final float OPACITY_OPAQUE = 1.0f;
60+ public static final float OPACITY_HALF = 0.5f;
61+
5762 private static MoeUI moeUI;
58-
63+
5964 private final JFrame frame;
6065 private final JRootPane rootPane;
6166 private final Container contentPane;
@@ -116,19 +121,11 @@
116121 ui = new MoeRootPaneUI();
117122 rootPane.setUI(ui);
118123 }
119- ui.setBackground(image);
124+ ui.setBackgroundImage(image);
120125 uis.put(target, ui);
121126
122127 } else if (target.compareTo(Parts.EDITOR) >= 0) {
123- MoeTextPaneUI ui;
124- if (uis.containsKey(target)) {
125- ui = (MoeTextPaneUI) uis.get(target);
126- } else {
127- ui = new MoeTextPaneUI();
128- getTextPane(target).setUI(ui);
129- }
130- ui.setBackground(image);
131- uis.put(target, ui);
128+ getTextPaneUI(target).setBackgroundImage(image);
132129 }
133130 }
134131
@@ -143,19 +140,11 @@
143140 ui = new MoeRootPaneUI();
144141 rootPane.setUI(ui);
145142 }
146- ui.setBackground(color);
143+ ui.setBackgroundColor(color);
147144 uis.put(target, ui);
148145
149146 } else if (target.compareTo(Parts.EDITOR) >= 0) {
150- MoeTextPaneUI ui;
151- if (uis.containsKey(target)) {
152- ui = (MoeTextPaneUI) uis.get(target);
153- } else {
154- ui = new MoeTextPaneUI();
155- getTextPane(target).setUI(ui);
156- }
157- ui.setBackground(color);
158- uis.put(target, ui);
147+ getTextPaneUI(target).setBackgroundColor(color);
159148 }
160149 }
161150
@@ -173,30 +162,53 @@
173162 ui.setOpacity(opacity);
174163 uis.put(target, ui);
175164
176- } else if (target.compareTo(Parts.EDITOR) >= 0) {
177- MoeTextPaneUI ui;
178- if (uis.containsKey(target)) {
179- ui = (MoeTextPaneUI) uis.get(target);
180- } else {
181- ui = new MoeTextPaneUI();
182- getTextPane(target).setUI(ui);
183- }
184- ui.setOpacity(opacity);
185- uis.put(target, ui);
165+ } else {
166+ // noop
167+ // メインウィンドウ以外の個別ペインは不透明度 1.0f 固定とします。
168+ // 半透過にすると、残像が残るためです。
169+ Log.log("warning: setOpacity(" + target.name() + ", " + opacity
170+ + ") is ignored. Opacity is available only for MainWindow.");
186171 }
187172 }
188173
189- // MainWindow に画像や色を割り当てる場合のみ使用します
190- public void transparent(EnumSet<Parts> exclude) {
191- //@@TODO EDITOR などのペインが指定された場合に対応
192- if (exclude != null) {
193- makeTransparentMenubar = !exclude.contains(Parts.MenuBar);
194- makeTransparentButtonPanel = !exclude.contains(Parts.ButtonPanel);
195- makeTransparentStatusbar = !exclude.contains(Parts.StatusBar);
196- makeTransparentPaneTitlebar = !exclude.contains(Parts.PaneTitleBar);
174+ // MainWindow と EDITOR に画像や色を割り当てる場合のみ使用します
175+ public void transparent(Parts target, EnumSet<Parts> exclude) {
176+ switch (target) {
177+ case MainWindow:
178+ if (exclude != null) {
179+ makeTransparentMenubar = !exclude.contains(Parts.MenuBar);
180+ makeTransparentButtonPanel = !exclude.contains(Parts.ButtonPanel);
181+ makeTransparentStatusbar = !exclude.contains(Parts.StatusBar);
182+ makeTransparentPaneTitlebar = !exclude.contains(Parts.PaneTitleBar);
183+ }
184+ transparent();
185+ break;
186+
187+ case EDITOR:
188+ UIThreadsUtil.mustBeSwingThread();
189+ transparentInstantStart(desktop);
190+
191+ // エディター(インスタントスタートではない方) ペインに個別に
192+ // 背景を設定するためには、結局プロジェクトのロード時に現在の
193+ // エフェクト設定で再度エディターを取得して setUI し直す必要がある。
194+ // この行が実行される時点では、インスタントスタートと編集画面の
195+ // どちらのモードか不明なので、いったん編集画面の設定を試みて、
196+ // 失敗したらプロジェクトのロード時に再試行するクロージャを投げる。
197+ final JEditorPane editor = getJEditorPaneFromEditor(desktop);
198+ final MoeTextPaneUI ui = getTextPaneUI(Parts.EDITOR);
199+ if (editor == null || editor instanceof javax.swing.JTextPane) {
200+ // Editor is not available yet. Wait for project open event.
201+ EditorUIRunner editorUIRunner = new EditorUIRunner();
202+ editorUIRunner.setBackgroundImage(ui.getBackgroundImage());
203+ editorUIRunner.setBackgroundColor(ui.getBackgroundColor());
204+ CoreEvents.registerProjectChangeListener(editorUIRunner);
205+ } else {
206+ // Editor is found. Set UI and migrate highlighter.
207+ Highlighter h = editor.getHighlighter(); // save old highlighter
208+ editor.setUI(ui);
209+ editor.setHighlighter(h); // restore highlighter
210+ }
197211 }
198-
199- transparent();
200212 }
201213
202214 private void transparent() {
@@ -294,7 +306,7 @@
294306 *
295307 int alpha = 100; // transparent <- 0...255 -> opaque
296308 Color color = SystemColor.menu;
297- editor.setBackground(new Color( color.getRGB() & 0xffffff | 100 << 24, true));
309+ editor.setBackgroundImage(new Color( color.getRGB() & 0xffffff | 100 << 24, true));
298310 * */
299311 editor.setOpaque(false);
300312 frame.repaint();
@@ -301,7 +313,7 @@
301313 return true;
302314 }
303315
304- private JEditorPane getTextPane(Parts pane) {
316+ private JEditorPane getJEditorPane(Parts pane) {
305317 /*
306318 dockable.getDockKey().getKey()
307319 dockable.getComponent().class.name
@@ -550,4 +562,65 @@
550562 }
551563 return null;
552564 }
565+
566+ private MoeTextPaneUI getTextPaneUI(Parts target) {
567+ MoeTextPaneUI ui;
568+ if (uis.containsKey(target)) {
569+ ui = (MoeTextPaneUI) uis.get(target);
570+ } else {
571+ ui = new MoeTextPaneUI();
572+ JEditorPane pane = getJEditorPane(target);
573+ Highlighter h = pane.getHighlighter(); // save old highlighter
574+ pane.setUI(ui);
575+ pane.setHighlighter(h); // restore highlighter
576+ if (!pane.isOpaque()) {
577+ pane.setOpaque(true);
578+ if (target == Parts.EDITOR) {
579+ isEditorTransparent = false;
580+ }
581+ }
582+ uis.put(target, ui);
583+ }
584+ return ui;
585+ }
586+
587+ /**
588+ * エディター専用の UI です。プロジェクトの開始時にエディターに自身を UI と
589+ * して自動設定します。
590+ * 呼び出し側で、このクラスのインスタンスをプロジェクトイベントのリスナーに
591+ * 登録しておく必要があります。
592+ */
593+ private class EditorUIRunner extends MoeTextPaneUI
594+ implements IProjectEventListener, Runnable {
595+
596+ @Override
597+ public void run() {
598+ // 実行は一回きりで良いので、リスナー登録を解除する
599+ CoreEvents.unregisterProjectChangeListener(this);
600+
601+ // エディターに UI を設定し、ハイライターを復元する
602+ JEditorPane editor = getJEditorPaneFromEditor(desktop);
603+ Highlighter h = editor.getHighlighter(); // save old highlighter
604+ editor.setUI(this); //@@TODO このインスタンスを管理する必要がある
605+ editor.setHighlighter(h); // restore highlighter
606+
607+ // エディターが透明の場合は不透過に設定する
608+ if (!editor.isOpaque()) {
609+ editor.setOpaque(true);
610+ isEditorTransparent = false;
611+ }
612+ }
613+
614+ @Override
615+ public void onProjectChanged(PROJECT_CHANGE_TYPE eventType) {
616+ switch (eventType) {
617+ case CREATE:
618+ case LOAD:
619+ // ここですぐエディターの透過処理をしてもうまく適用されないので、
620+ // 遅延処理する。
621+ SwingUtilities.invokeLater(this);
622+ }
623+ }
624+
625+ }
553626 }