package logbook.gui;
import java.io.File;
import java.io.IOException;
import java.text.MessageFormat;
import logbook.config.AppConfig;
import logbook.server.proxy.Filter;
import logbook.util.SwtUtils;
import org.apache.commons.io.FileUtils;
import org.apache.commons.lang3.StringUtils;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.ModifyEvent;
import org.eclipse.swt.events.ModifyListener;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Dialog;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.FileDialog;
import org.eclipse.swt.widgets.Group;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.MessageBox;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.Text;
/**
* 自動プロキシ構成スクリプトファイル生成
*/
public final class CreatePacFileDialog extends Dialog {
protected static final String SCRIPT = "function FindProxyForURL(url, host) '{'\r\n"
+ " if (/^{0}/.test(host)) '{'\r\n"
+ " return \"PROXY 127.0.0.1:{1}; DIRECT\";\r\n"
+ " '}'\r\n"
+ " return \"DIRECT\";\r\n"
+ "'}'\r\n";
protected Shell shell;
protected String server;
protected Text iePath;
protected Text firefoxPath;
/**
* Create the dialog.
* @param parent
*/
public CreatePacFileDialog(Shell parent) {
super(parent, SWT.CLOSE | SWT.TITLE | SWT.MIN | SWT.RESIZE);
}
/**
* Open the dialog.
*/
public void open() {
this.createContents();
this.shell.open();
this.shell.layout();
Display display = this.getParent().getDisplay();
while (!this.shell.isDisposed()) {
if (!display.readAndDispatch()) {
display.sleep();
}
}
}
/**
* Create contents of the dialog.
*/
private void createContents() {
this.shell = new Shell(this.getParent(), this.getStyle());
this.shell.setText("自動プロキシ構成スクリプトファイル生成");
this.shell.setLayout(new GridLayout(1, false));
Composite composite = new Composite(this.shell, SWT.NONE);
composite.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
composite.setLayout(new GridLayout(1, false));
Label labelTitle = new Label(composite, SWT.NONE);
labelTitle.setText("自動プロキシ構成スクリプトファイルを生成します");
String server = Filter.getServerName();
if (server == null) {
Group manualgroup = new Group(composite, SWT.NONE);
manualgroup.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
manualgroup.setLayout(new GridLayout(2, false));
manualgroup.setText("鎮守府サーバーが未検出です。IPアドレスを入力して下さい。");
Label iplabel = new Label(manualgroup, SWT.NONE);
iplabel.setText("IPアドレス:");
final Text text = new Text(manualgroup, SWT.BORDER);
GridData gdip = new GridData(SWT.LEFT, SWT.CENTER, false, false, 1, 1);
gdip.widthHint = SwtUtils.DPIAwareWidth(150);
text.setLayoutData(gdip);
text.setText("0.0.0.0");
text.addModifyListener(new ModifyListener() {
@Override
public void modifyText(ModifyEvent e) {
CreatePacFileDialog.this.server = text.getText();
}
});
this.server = "0.0.0.0";
} else {
this.server = server;
}
Button storeButton = new Button(composite, SWT.NONE);
storeButton.setText("保存先を選択...");
storeButton.addSelectionListener(new FileSelectionAdapter(this));
Group addrgroup = new Group(composite, SWT.NONE);
addrgroup.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
addrgroup.setLayout(new GridLayout(2, false));
addrgroup.setText("アドレス(保存先のアドレスより生成されます)");
Label ieAddrLabel = new Label(addrgroup, SWT.NONE);
ieAddrLabel.setText("IE用:");
this.iePath = new Text(addrgroup, SWT.BORDER);
GridData gdIePath = new GridData(SWT.FILL, SWT.CENTER, true, false, 1, 1);
gdIePath.widthHint = SwtUtils.DPIAwareWidth(380);
this.iePath.setLayoutData(gdIePath);
Label fxAddrLabel = new Label(addrgroup, SWT.NONE);
fxAddrLabel.setText("Firefox用:");
this.firefoxPath = new Text(addrgroup, SWT.BORDER);
GridData gdFxPath = new GridData(SWT.FILL, SWT.CENTER, true, false, 1, 1);
gdFxPath.widthHint = SwtUtils.DPIAwareWidth(380);
this.firefoxPath.setLayoutData(gdFxPath);
this.shell.pack();
}
/**
* PACファイルを書き込みます
*/
private static final class FileSelectionAdapter extends SelectionAdapter {
private final Shell shell;
private final CreatePacFileDialog parent;
public FileSelectionAdapter(CreatePacFileDialog dialog) {
this.shell = dialog.shell;
this.parent = dialog;
}
@Override
public void widgetSelected(SelectionEvent e) {
FileDialog dialog = new FileDialog(this.shell, SWT.SAVE);
dialog.setFileName("proxy.pac");
dialog.setFilterExtensions(new String[] { "*.pac" });
String filename = dialog.open();
if (filename != null) {
if (!StringUtils.isAsciiPrintable(filename)) {
MessageBox messageBox = new MessageBox(this.shell, SWT.ICON_WARNING);
messageBox.setText("注意");
messageBox.setMessage("保存先にASCII範囲外の文字(全角文字等)が含まれています。\nこのアドレスはInternetExplorerで読み込めません。");
messageBox.open();
}
MessageBox messageBox = new MessageBox(this.shell, SWT.ICON_INFORMATION);
messageBox.setText("成功");
messageBox.setMessage("自動プロキシ構成スクリプトファイルを生成しました。\r\n"
+ "次にブラウザの設定を行って下さい。");
messageBox.open();
String script = MessageFormat.format(CreatePacFileDialog.SCRIPT,
this.parent.server.replace(".", "\\."),
Integer.toString(AppConfig.get().getListenPort()));
File file = new File(filename);
if (file.getAbsolutePath().startsWith("\\\\")) {
this.parent.iePath.setText("file://\\\\" + file.getAbsolutePath().substring(2).replace("\\", "/"));
} else {
this.parent.iePath.setText("file://" + file.getAbsolutePath().replace("\\", "/"));
}
this.parent.firefoxPath.setText("file:///" + file.toURI().toString().replaceFirst("file:/", ""));
try {
FileUtils.write(file, script);
} catch (IOException e1) {
MessageBox errMessageBox = new MessageBox(this.shell, SWT.ICON_ERROR);
errMessageBox.setText("書き込めませんでした");
errMessageBox.setMessage(e1.toString());
errMessageBox.open();
}
}
}
}
}