• 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

Revision32 (tree)
Time2014-05-17 23:40:10
Authoryu-tang

Log Message

メニューバーおよびペインタイトルバーを透過しない設定の場合、背景画像の描画開始位置の上方にマージンを追加

Change Summary

Incremental Difference

--- trunk/src/jp/sourceforge/users/yutang/omegat/plugin/moenizer/MoeLayeredPane.java (revision 31)
+++ trunk/src/jp/sourceforge/users/yutang/omegat/plugin/moenizer/MoeLayeredPane.java (revision 32)
@@ -22,6 +22,7 @@
2222 import java.awt.Rectangle;
2323 import java.awt.TexturePaint;
2424 import java.awt.image.BufferedImage;
25+import java.awt.image.WritableRaster;
2526 import javax.swing.JLayeredPane;
2627
2728 /**
@@ -45,11 +46,16 @@
4546 private BufferedImage image = null;
4647 private TexturePaint paint = null;
4748 private float alpha = 0.5f; //@@TODO replace literal to constant
49+ private int paintMarginTop = 0;
4850
4951 public MoeLayeredPane() {
5052 super();
5153 }
52-
54+
55+ public void setPaintMarginTop(int paintMarginTop) {
56+ this.paintMarginTop = paintMarginTop;
57+ }
58+
5359 public void setBackground(BufferedImage image) {
5460 setPicture(image);
5561 this.repaint();
@@ -58,14 +64,17 @@
5864 @Override
5965 protected void paintComponent(Graphics g) {
6066 if (image != null) {
61- Graphics2D g2 = (Graphics2D)g.create();
67+ Graphics2D g2 = (Graphics2D) g.create();
6268 g2.setComposite(makeComposite(alpha));
6369
6470 if (getWidth() > image.getWidth() || getHeight() > image.getHeight()) {
65- g2.setPaint(paint);
66- g2.fillRect(0, 0, getWidth(), getHeight());
71+ //g2.setPaint(paint);
72+ //g2.fillRect(0, 0, getWidth(), getHeight());
73+ //g2.fillRect(0, paintMarginTop, getWidth(), getHeight());
74+ BufferedImage tiledImage = createTiledImage(image, getWidth(), getHeight());
75+ g2.drawImage(tiledImage, 0, paintMarginTop, this);
6776 } else {
68- g2.drawImage(image, 0, 0, this);
77+ g2.drawImage(image, 0, paintMarginTop, this);
6978 }
7079
7180 g2.dispose();
@@ -75,7 +84,7 @@
7584
7685 private AlphaComposite makeComposite(float alpha) {
7786 int type = AlphaComposite.SRC_OVER;
78- return(AlphaComposite.getInstance(type, alpha));
87+ return AlphaComposite.getInstance(type, alpha);
7988 }
8089
8190 private void setPicture(BufferedImage image) {
@@ -88,4 +97,19 @@
8897 this.paint = new TexturePaint(image, rect);
8998 }
9099 }
100+
101+ private BufferedImage createTiledImage(BufferedImage image, int width, int height) {
102+ WritableRaster r1 = image.getRaster();
103+ WritableRaster r2 = r1.createCompatibleWritableRaster(width, height);
104+ int w = r1.getWidth();
105+ int h = r1.getHeight();
106+ for (int x = 0; x < width; x += w) {
107+ for (int y = 0; y < height; y += h) {
108+ r2.setRect(x, y, r1);
109+ }
110+ }
111+ BufferedImage ret = new BufferedImage(width, height, image.getType());
112+ ret.setData(r2);
113+ return ret;
114+ }
91115 }
--- trunk/src/jp/sourceforge/users/yutang/omegat/plugin/moenizer/MoeUI.java (revision 31)
+++ trunk/src/jp/sourceforge/users/yutang/omegat/plugin/moenizer/MoeUI.java (revision 32)
@@ -54,7 +54,6 @@
5454 private DockingDesktop desktop;
5555 private JPanel statusBar;
5656 private AutoHideButtonPanel buttonPanel;
57-
5857
5958 private boolean makeTransparentMenubar = true;
6059 private boolean makeTransparentButtonPanel = true;
@@ -83,9 +82,14 @@
8382 UIThreadsUtil.mustBeSwingThread();
8483
8584 if (makeTransparentMenubar) {
86- //@@TODO メニューバーが不透過の場合、背景画像の上描画位置を調整する必要がある
87- //@@TODO makeTransparentPaneTitlebar フィールド対応
8885 transparent(menuBar);
86+ } else {
87+ int marginTop = 0;
88+ marginTop = menuBar.getHeight();
89+ if (!makeTransparentPaneTitlebar) {
90+ marginTop += getDockViewTitleBarHeight(desktop);
91+ }
92+ layeredPane.setPaintMarginTop(marginTop);
8993 }
9094 transparentRecursive(contentPane);
9195 transparentInstantStart(desktop);
@@ -92,7 +96,25 @@
9296
9397 frame.repaint();
9498 }
95-
99+
100+ private int getDockViewTitleBarHeight(DockingDesktop desktop) {
101+ Dockable dockable = null;
102+ for (DockableState d: desktop.getDockables()) {
103+ if (!isDockableIconized(d)) {
104+ dockable = d.getDockable();
105+ break;
106+ }
107+ }
108+
109+ // DockView
110+ Container container = dockable.getComponent().getParent();
111+ DockView view = (DockView) container;
112+
113+ // TitleBar
114+ DockViewTitleBar titleBar = view.getTitleBar();
115+ return titleBar.getHeight();
116+ }
117+
96118 public void transparentEditor() {
97119 // Editor に表示されるドキュメントは、以下のケースでまったく異なる。
98120 //
@@ -167,12 +189,12 @@
167189 }
168190
169191 private void transparent(JMenuBar menuBar) {
170-// menuBar.setUI ( new BasicMenuBarUI () {
171-// 上記だと初期表示時に、アクティブメニューがアクティブで描画されない。
172-// マウス通過などのタイミングで再描画された際にアクティブカラーになるが、
173-// 見栄えが悪いので、Windows 用の UI を指定する。
174-// アクティブメニューがアクティブで描画されない問題はこれで解決するが、
175-// 変わりに Mac や *nix など別 L&F 環境下では違和感があるかもしれない。
192+ //menuBar.setUI ( new BasicMenuBarUI () {
193+ // 上記だと初期表示時に、アクティブメニューがアクティブで描画されない。
194+ // マウス通過などのタイミングで再描画された際にアクティブカラーになるが、
195+ // 見栄えが悪いので、Windows 用の UI を指定する。
196+ // アクティブメニューがアクティブで描画されない問題はこれで解決するが、
197+ // 変わりに Mac や *nix など別 L&F 環境下では違和感があるかもしれない。
176198 menuBar.setUI ( new WindowsMenuBarUI () {
177199 @Override
178200 public void paint ( Graphics g, JComponent c ) {
@@ -228,16 +250,20 @@
228250 // + splitContainer(VERTICAL) <-- DockView.getParent()
229251 // + DockView <-- Dockable.getParent()
230252 // + Dockable <-- DockableState.getDockable()
231- for (DockableState d: desktop.getDockables()) {
232- double width = d.getPosition().getWidth();
233- // width (height や x, y でも可) が 0.0 以外の場合はアイコン化されているので、透過処理不要
234- // 他に適切な判定方法がありそうだけれども、分からなかったので、とりあえずこれで。
235- if (width == 0.0) {
253+ for (DockableState d : desktop.getDockables()) {
254+ if (!isDockableIconized(d)) {
236255 transparentRecursive(d);
237256 }
238257 }
239258 }
259+ private boolean isDockableIconized(DockableState dockableState) {
260+ double width = dockableState.getPosition().getWidth();
240261
262+ // width (height や x, y でも可) が 0.0 以外の場合はアイコン化されている。
263+ // 他に適切な判定方法がありそうだけれども、分からなかったので、とりあえずこれで。
264+ return (width != 0.0);
265+ }
266+
241267 private void transparentRecursive(DockableState dockableState) {
242268 Dockable dockable = dockableState.getDockable();
243269
@@ -333,7 +359,7 @@
333359 // ここでは 3 番目の AutoHideButtonPanel を取得したい。
334360 // 状態が不明(非表示の場合は、他の AutoHideButtonPanel と識別できない)
335361 // なので、とりあえずインデックスで決め打ちする。
336- return (AutoHideButtonPanel) panel.getComponent(2);
362+ return panel == null ? null : (AutoHideButtonPanel) panel.getComponent(2);
337363 }
338364
339365 private JEditorPane getJEditorPaneFromEditor(DockingDesktop desktop) {