package open.dolphin.impl.scheam;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.util.Properties;
import javax.swing.ImageIcon;
import open.dolphin.impl.scheam.schemahelper.SchemaUtils;
import open.dolphin.project.Project;
/**
* SchemaEditor で使われる変数を一括管理する
* @author pns
*/
public class SchemaEditorProperties {
//masuda^ Preferences -> Propertiesに変更
//private static Preferences prefs;
private static final String SETTING_FILE_NAME = "schema-editor.properties";
private static Properties props;
//masuda$
public static final String DEFAULT_ROLE = java.util.ResourceBundle.getBundle("open/dolphin/impl/scheam/resources/SchemaEditorProperties").getString("defaultRole.refFig");
public static final String DEFAULT_TITLE = java.util.ResourceBundle.getBundle("open/dolphin/impl/scheam/resources/SchemaEditorProperties").getString("defaultTitle.refImage");
public static final Dimension SHAPEICON_SIZE = new Dimension(48,8);
public static final Dimension CPALETTE_SIZE = new Dimension(16,16);
// デフォルト値(DEFAULT_OOO)とプロパティー名(PN_OOO)
private static final String PN_LINE_WIDTH = "lineWidth";
private static final float DEFAULT_LINE_WIDTH = 2.5f;
private static final String PN_FILL_COLOR = "fillColor";
private static final Color DEFAULT_FILL_COLOR = Color.RED;
private static final String PN_ALPHA = "alpha";
private static final float DEFAULT_ALPHA = 0.5f;
private static final String PN_TBUTTON_NUMBER = "toolButton";
private static final int DEFAULT_TBUTTON_NUMBER = 0;
private static final String PN_FONT_SIZE = "textSize";
private static final int DEFAULT_FONT_SIZE = 24;
private static final String PN_CANVAS_VIEW_RECT = "canvasViewRect";
private static final String PN_TOOL_VIEW_RECT = "toolViewRect";
private static final String DEFAULT_FONT_NAME = "Dialog";
// 描画に使われる変数
// プロパティーファイルに load/save する変数
private float lineWidth = DEFAULT_LINE_WIDTH;
private Color fillColor = DEFAULT_FILL_COLOR;
private float alpha = DEFAULT_ALPHA;
private int selectedTButtonNumber = DEFAULT_TBUTTON_NUMBER;
private Rectangle canvasViewRect;
private Rectangle toolViewRect;
private int fontSize = DEFAULT_FONT_SIZE;
// プロパティーファイル非対応
private String fontName = DEFAULT_FONT_NAME;
private int fontStyle = Font.BOLD;
private boolean fill = true;
private boolean isRightRotation;
// アイコン
public static final ImageIcon ICON_ERASER = new ImageIcon(SchemaEditorImpl.class.getResource(
"/open/dolphin/impl/scheam/resources/eraserCursor.gif"));
public SchemaEditorProperties() {
//masuda^
//prefs = Preferences.userNodeForPackage(SchemaEditorImpl.class);
if (props == null) {
props = new Properties();
Project.loadProperties(props, SETTING_FILE_NAME);
}
//masuda$
}
/**
* 線の太さを返す
* @return
*/
public float getLineWidth() {
return lineWidth;
}
/**
* 線の太さを設定する
* @param lineWidth
*/
public void setLineWidth(float lineWidth) {
this.lineWidth = lineWidth;
}
/**
* 色を返す
* @return
*/
public Color getFillColor() {
return fillColor;
}
/**
* 色を設定する
* @param fillColor
*/
public void setFillColor(Color fillColor) {
this.fillColor = fillColor;
}
/**
* アルファ値を返す
* @return
*/
public float getAlpha() {
return alpha;
}
/**
* アルファ値を設定する
* @param alpha
*/
public void setAlpha(float alpha) {
this.alpha = alpha;
}
/**
* テキストサイズを返す
* @return
*/
public int getTextSize() {
return fontSize;
}
/**
* テキストサイズを設定する
* @param textSize
*/
public void setTextSize(int textSize) {
this.fontSize = textSize;
}
/**
* 塗るかどうかを返す
* @return
*/
public boolean isFill() {
return fill;
}
/**
* 塗りかどうか設定
* @param fill
*/
public void setIsFill(boolean fill) {
this.fill = fill;
}
/**
* フォント名を返す
* @return
*/
public String getFontName() {
return fontName;
}
/**
* フォント名を設定する
* @param fontName
*/
public void setFontName(String fontName) {
this.fontName = fontName;
}
/**
* フォントスタイルを返す
* @return
*/
public int getFontStyle() {
return fontStyle;
}
/**
* フォントスタイルを設定する
* @param fontStyle
*/
public void setFontStyle(int fontStyle) {
this.fontStyle = fontStyle;
}
/**
* フォントサイズを返す
* @return
*/
public int getFontSize() {
return fontSize;
}
/**
* フォントサイズを設定する
* @param size
*/
public void setFontSize(int size) {
fontSize = size;
}
/**
* 選択されたツールボタンの番号を返す
* @return
*/
public int getSelectedTButtonNumber() {
return this.selectedTButtonNumber;
}
/**
* 選択されたツールボタンの番号を設定する
* @param n
*/
public void setSelectedTButtonNumber(int n) {
this.selectedTButtonNumber = n;
}
/**
* 線のストロークを返す
* @return
*/
public Stroke getStroke() {
return new BasicStroke(lineWidth, BasicStroke.CAP_ROUND, BasicStroke.JOIN_ROUND);
}
/**
* 消しゴムのストロークを返す
* @return
*/
public Stroke getEraserStroke() {
return new BasicStroke(16.0f, BasicStroke.CAP_ROUND, BasicStroke.JOIN_ROUND);
}
/**
* 1ドット幅の stroke
* @return
*/
public Stroke getOutlineStroke() {
return new BasicStroke(1.5f, BasicStroke.CAP_ROUND, BasicStroke.JOIN_ROUND);
}
/**
* アルファコンポジットを返す
* @return
*/
public AlphaComposite getAlphaComposite() {
return AlphaComposite.getInstance(AlphaComposite.SRC_OVER, alpha);
}
/**
* テキストのアルファコンポジットを返す
* @return
*/
public AlphaComposite getTextComposite() {
return AlphaComposite.getInstance(AlphaComposite.SRC_OVER, getTextAlpha());
}
/**
* テキストのフォントを返す
* @return
*/
public Font getFont() {
return new Font(fontName, fontStyle, fontSize);
}
/**
* テキストの色を返す
* @return
*/
public Color getTextColor() {
return fillColor;
}
/**
* テキストの色を設定する
* @param textColor
*/
public void setTextColor(Color textColor) {
//this.textColor = textColor;
}
/**
* テキストのアルファ値を返す
* @return
*/
public float getTextAlpha() {
return alpha;
}
/**
* テキストのアルファ値を設定する
* @param textAlpha
*/
public void setTextAlpha(float textAlpha) {
//this.textAlpha = textAlpha;
}
/**
* テキストの outline を書くときの stroke
* @return
*/
public Stroke getTextStroke() {
return new BasicStroke(1.0f, BasicStroke.CAP_ROUND, BasicStroke.JOIN_ROUND);
}
/**
* G2D 描画に必要な情報をセットする (stroke, alpha, color)
* @param g2d
*/
public void setGraphicsState(Graphics2D g2d) {
g2d.setStroke(getStroke());
g2d.setComposite(getAlphaComposite());
g2d.setPaint(fillColor);
g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
}
/**
* SchemaView の bounds をセットする
* @param cv
* @param tv
*/
public void setSchemaViewRect(SchemaCanvasView cv, SchemaToolView tv) {
canvasViewRect = cv.getBounds();
toolViewRect = tv.getBounds();
}
/**
* 回転変換の右左をセットする
* @param b
*/
public void setIsRightRotation(boolean b) {
isRightRotation = b;
}
/**
* 回転変換の方向を返す
* @return
*/
public boolean isRightRotation() {
return isRightRotation;
}
/**
* プロパティーファイルから読み込む
*/
public void load() {
//masuda^ Preferences -> Propertiesに変更
lineWidth = Float.valueOf(props.getProperty(PN_LINE_WIDTH, String.valueOf(DEFAULT_LINE_WIDTH)));
alpha = Float.valueOf(props.getProperty(PN_ALPHA, String.valueOf(DEFAULT_ALPHA)));
selectedTButtonNumber = Integer.valueOf(props.getProperty(PN_TBUTTON_NUMBER, "0"));
fillColor = SchemaUtils.stringToColor(props.getProperty(PN_FILL_COLOR, "255,0,0"));
canvasViewRect = SchemaUtils.stringToRectangle(props.getProperty(PN_CANVAS_VIEW_RECT, null));
toolViewRect = SchemaUtils.stringToRectangle(props.getProperty(PN_TOOL_VIEW_RECT, null));
fontSize = Integer.valueOf(props.getProperty(PN_FONT_SIZE, String.valueOf(DEFAULT_FONT_SIZE)));
/*
lineWidth = prefs.getFloat(PN_LINE_WIDTH, DEFAULT_LINE_WIDTH);
alpha = prefs.getFloat(PN_ALPHA, DEFAULT_ALPHA);
selectedTButtonNumber = prefs.getInt(PN_TBUTTON_NUMBER, 0);
fillColor = SchemaUtils.stringToColor(prefs.get(PN_FILL_COLOR, "255,0,0"));
canvasViewRect = SchemaUtils.stringToRectangle(prefs.get(PN_CANVAS_VIEW_RECT, null));
toolViewRect = SchemaUtils.stringToRectangle(prefs.get(PN_TOOL_VIEW_RECT, null));
fontSize = prefs.getInt(PN_FONT_SIZE, DEFAULT_FONT_SIZE);
*/
//masuda$
}
/**
* プロパティーファイルに保存する
*/
public void save() {
//masuda^ Preferences -> Propertiesに変更
props.setProperty(PN_LINE_WIDTH, String.valueOf(lineWidth));
props.setProperty(PN_ALPHA, String.valueOf(alpha));
props.setProperty(PN_TBUTTON_NUMBER, String.valueOf(selectedTButtonNumber));
props.setProperty(PN_FILL_COLOR, SchemaUtils.colorToString(fillColor));
props.setProperty(PN_CANVAS_VIEW_RECT, SchemaUtils.rectangleToString(canvasViewRect));
props.setProperty(PN_TOOL_VIEW_RECT, SchemaUtils.rectangleToString(toolViewRect));
props.setProperty(PN_FONT_SIZE, String.valueOf(fontSize));
Project.storeProperties(props, SETTING_FILE_NAME);
/*
prefs.putFloat(PN_LINE_WIDTH, lineWidth);
prefs.putFloat(PN_ALPHA, alpha);
prefs.putInt(PN_TBUTTON_NUMBER, selectedTButtonNumber);
prefs.put(PN_FILL_COLOR, SchemaUtils.colorToString(fillColor));
prefs.put(PN_CANVAS_VIEW_RECT, SchemaUtils.rectangleToString(canvasViewRect));
prefs.put(PN_TOOL_VIEW_RECT, SchemaUtils.rectangleToString(toolViewRect));
prefs.putInt(PN_FONT_SIZE, fontSize);
*/
//masuda$
}
/**
* canvasView, toolView の表示位置を計算して設定する
* 設定前の値として preferences の値を使うバージョン
* @param cv
* @param tv
* @param baseImage
*/
public void computeViewBounds(SchemaCanvasView cv, SchemaToolView tv, BufferedImage baseImage) {
computeViewBounds(cv, tv, baseImage, canvasViewRect, toolViewRect);
}
/**
* canvasView, toolView の表示位置を計算して設定する
* 設定前の値として現在の bounds を使うバージョン
* @param cv
* @param tv
* @param baseImage
*/
public void recomputeViewBounds(SchemaCanvasView cv, SchemaToolView tv, BufferedImage baseImage) {
computeViewBounds(cv, tv, baseImage, cv.getBounds(), tv.getBounds());
}
/**
* canvasView, toolView の表示位置を計算する
* canvasView は pack() とかしても自動でいい大きさになってくれないので
* @param cv SchemaCanvasView
* @param tv ToolCanvasView
* @param baseImage
* @param pCvRect 設定する前の canvasView の bounds
* @param pTvRect 設定する前の toolView の bounds
*/
public void computeViewBounds(SchemaCanvasView cv, SchemaToolView tv, BufferedImage baseImage, Rectangle pCvRect, Rectangle pTvRect) {
Rectangle cvRect = getCanvasViewRectangle(baseImage);
Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
if (pCvRect == null) {
// 以前の値が保存されてなければ画面中央に
cvRect.x = (screenSize.width - cvRect.width) / 2;
cvRect.y = (screenSize.height - cvRect.height) / 2;
} else {
cvRect.x = pCvRect.x;
cvRect.y = pCvRect.y;
// はみ出ていたり変な値だったら適当に修正
if (cvRect.x < 0) cvRect.x = 0;
else if (cvRect.x > screenSize.width - cvRect.width - 100) cvRect.x = screenSize.width - cvRect.width -100;
if (cvRect.y < 24) cvRect.y = 24;
else if (cvRect.y > screenSize.height - cvRect.height) cvRect.y = screenSize.height - cvRect.height;
}
cv.setBounds(cvRect);
cv.getCanvasPanel().revalidate(); // 小さく cut 後に zoom したとき対応
Rectangle tvRect = tv.getBounds();
tvRect.y = cvRect.y;
if (pTvRect == null) {
// プロパティー値が保存されていない場合,左にくっつける
tvRect.x = cvRect.x - tvRect.width - 2;
} else {
// 以前の値が右にくっついている場合はくっつくように調整
if (pTvRect.x == pCvRect.x + pCvRect.width +2) {
tvRect.x = cvRect.x + cvRect.width + 2;
// それ以外は以前の値をそのまま設定
} else {
tvRect.x = pTvRect.x;
}
}
tv.setBounds(tvRect);
}
/**
* baseImage から必要な view の大きさを計算する(試行錯誤で見つけ出した値)
* @param baseImage
* @return
*/
public Rectangle getCanvasViewRectangle(BufferedImage baseImage) {
// width は最低 550 (ボタン配置などで 500 + 絵の margin 25x2)
int width = baseImage.getWidth();
width = (width > 500)? width: 500;
width += 50;
// height は最低 284 (ボタン,タイトルバーなどで 144 + margin 120)
int height = baseImage.getHeight();
height = (height > 144)? height: 144;
height += 120;
return new Rectangle(0, 0, width, height);
}
}