1
package org.herac.tuxguitar.gui.tools.custom.converter;
3
import org.eclipse.swt.SWT;
4
import org.eclipse.swt.custom.StyleRange;
5
import org.eclipse.swt.custom.StyledText;
6
import org.eclipse.swt.events.DisposeEvent;
7
import org.eclipse.swt.events.DisposeListener;
8
import org.eclipse.swt.events.SelectionAdapter;
9
import org.eclipse.swt.events.SelectionEvent;
10
import org.eclipse.swt.events.ShellAdapter;
11
import org.eclipse.swt.events.ShellEvent;
12
import org.eclipse.swt.graphics.Color;
13
import org.eclipse.swt.layout.GridData;
14
import org.eclipse.swt.layout.GridLayout;
15
import org.eclipse.swt.widgets.Button;
16
import org.eclipse.swt.widgets.Composite;
17
import org.eclipse.swt.widgets.Shell;
18
import org.herac.tuxguitar.gui.TuxGuitar;
19
import org.herac.tuxguitar.gui.system.icons.IconLoader;
20
import org.herac.tuxguitar.gui.system.language.LanguageLoader;
21
import org.herac.tuxguitar.gui.util.DialogUtils;
22
import org.herac.tuxguitar.util.TGSynchronizer;
24
public class TGConverterProcess implements TGConverterListener,LanguageLoader,IconLoader{
26
private static final int SHELL_WIDTH = 650;
27
private static final int SHELL_HEIGHT = 350;
29
protected static final String EOL = ("\n");
31
protected static final Color COLOR_INFO = TuxGuitar.instance().getDisplay().getSystemColor(SWT.COLOR_BLUE);
32
protected static final Color COLOR_ERROR = TuxGuitar.instance().getDisplay().getSystemColor(SWT.COLOR_RED );
34
protected Shell dialog;
35
protected StyledText output;
36
protected Button buttonCancel;
37
protected Button buttonClose;
38
protected TGConverter converter;
39
protected boolean finished;
41
public void start(final String initFolder,String destFolder,String extension){
42
this.converter = new TGConverter(initFolder,destFolder);
43
this.converter.setExtension(extension);
44
this.converter.setListener(this);
48
new Thread(new Runnable() {
50
TGConverterProcess.this.converter.process();
55
protected void showProcess() {
56
this.finished = false;
58
this.dialog = DialogUtils.newDialog(TuxGuitar.instance().getShell(),SWT.SHELL_TRIM);
59
this.dialog.setLayout(new GridLayout());
60
this.dialog.setSize( SHELL_WIDTH , SHELL_HEIGHT );
61
this.dialog.addDisposeListener(new DisposeListener() {
62
public void widgetDisposed(DisposeEvent e) {
63
TuxGuitar.instance().getIconManager().removeLoader( TGConverterProcess.this );
64
TuxGuitar.instance().getLanguageManager().removeLoader( TGConverterProcess.this );
67
this.dialog.addShellListener(new ShellAdapter() {
68
public void shellClosed(ShellEvent e) {
69
e.doit = TGConverterProcess.this.finished;
73
Composite composite = new Composite(this.dialog,SWT.NONE);
74
composite.setLayout(new GridLayout());
75
composite.setLayoutData(new GridData(SWT.FILL,SWT.FILL,true,true));
77
this.output = new StyledText(composite,SWT.BORDER | SWT.MULTI | SWT.V_SCROLL | SWT.H_SCROLL);
78
this.output.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
79
this.output.setEditable(false);
81
//------------------BUTTONS--------------------------
82
Composite buttons = new Composite(this.dialog, SWT.NONE);
83
buttons.setLayout(new GridLayout(2,false));
84
buttons.setLayoutData(new GridData(SWT.RIGHT,SWT.BOTTOM,true,false));
86
this.buttonCancel = new Button(buttons, SWT.PUSH);
87
this.buttonCancel.setEnabled( false );
88
this.buttonCancel.setLayoutData(getButtonsData());
89
this.buttonCancel.addSelectionListener(new SelectionAdapter() {
90
public void widgetSelected(SelectionEvent arg0) {
91
TGConverterProcess.this.converter.setCancelled( true );
95
this.buttonClose = new Button(buttons, SWT.PUSH);
96
this.buttonClose.setEnabled( false );
97
this.buttonClose.setLayoutData(getButtonsData());
98
this.buttonClose.addSelectionListener(new SelectionAdapter() {
99
public void widgetSelected(SelectionEvent arg0) {
100
TGConverterProcess.this.dialog.dispose();
104
this.loadIcons(false);
105
this.loadProperties(false);
107
TuxGuitar.instance().getIconManager().addLoader( this );
108
TuxGuitar.instance().getLanguageManager().addLoader( this );
110
DialogUtils.openDialog(this.dialog, DialogUtils.OPEN_STYLE_CENTER);
113
private GridData getButtonsData(){
114
GridData data = new GridData(SWT.FILL,SWT.FILL,true,true);
115
data.minimumWidth = 80;
116
data.minimumHeight = 25;
120
public boolean isDisposed(){
121
return (this.dialog == null || this.dialog.isDisposed() );
124
public void loadProperties(){
125
this.loadProperties(true);
128
public void loadProperties(boolean layout){
130
this.dialog.setText(TuxGuitar.getProperty("batch.converter"));
131
this.buttonCancel.setText(TuxGuitar.getProperty("cancel"));
132
this.buttonClose.setText(TuxGuitar.getProperty("close"));
134
this.dialog.layout(true, true);
139
public void loadIcons() {
140
this.loadIcons(true);
143
public void loadIcons(boolean layout){
145
this.dialog.setImage(TuxGuitar.instance().getIconManager().getAppIcon());
147
this.dialog.layout(true, true);
152
//------------------------------------------------------------------------------------------------//
153
//---TGConverterListener Implementation ----------------------------------------------------------//
154
//------------------------------------------------------------------------------------------------//
156
public void notifyFileProcess(final String filename) {
159
TGSynchronizer.instance().addRunnable(new TGSynchronizer.TGRunnable() {
162
TGConverterProcess.this.output.append(TuxGuitar.getProperty("batch.converter.messages.converting", new String[] {filename}));
163
TGConverterProcess.this.output.setSelection( TGConverterProcess.this.output.getCharCount() );
167
} catch (Throwable e) {
173
public void notifyFileResult(final String filename, final int errorCode) {
176
TGSynchronizer.instance().addRunnable(new TGSynchronizer.TGRunnable() {
179
TGConverterProcess.this.appendLogMessage(errorCode, filename);
180
TGConverterProcess.this.output.setSelection( TGConverterProcess.this.output.getCharCount() );
184
} catch (Throwable e) {
190
public void notifyStart() {
193
TGSynchronizer.instance().addRunnable(new TGSynchronizer.TGRunnable() {
196
TGConverterProcess.this.finished = false;
197
TGConverterProcess.this.buttonClose.setEnabled( TGConverterProcess.this.finished );
198
TGConverterProcess.this.buttonCancel.setEnabled( !TGConverterProcess.this.finished );
199
TGConverterProcess.this.output.setCursor(TGConverterProcess.this.dialog.getDisplay().getSystemCursor(SWT.CURSOR_WAIT));
203
} catch (Throwable e) {
209
public void notifyFinish() {
212
TGSynchronizer.instance().addRunnable(new TGSynchronizer.TGRunnable() {
215
TGConverterProcess.this.finished = true;
216
TGConverterProcess.this.buttonClose.setEnabled( TGConverterProcess.this.finished );
217
TGConverterProcess.this.buttonCancel.setEnabled( !TGConverterProcess.this.finished );
218
TGConverterProcess.this.output.setCursor(TGConverterProcess.this.dialog.getDisplay().getSystemCursor(SWT.CURSOR_ARROW));
222
} catch (Throwable e) {
228
protected void appendLogMessage(int code, String fileName) {
229
String message = (TuxGuitar.getProperty( "batch.converter.messages." + (code == TGConverter.FILE_OK ? "ok" : "failed") ) + EOL);
232
case TGConverter.FILE_COULDNT_WRITE :
233
message += ( TuxGuitar.getProperty("batch.converter.messages.couldnt-write", new String[] {fileName}) + EOL );
235
case TGConverter.FILE_BAD :
236
message += ( TuxGuitar.getProperty("batch.converter.messages.bad-file", new String[] {fileName}) + EOL );
238
case TGConverter.FILE_NOT_FOUND :
239
message += ( TuxGuitar.getProperty("batch.converter.messages.file-not-found", new String[] {fileName}) + EOL );
241
case TGConverter.OUT_OF_MEMORY :
242
message += ( TuxGuitar.getProperty("batch.converter.messages.out-of-memory", new String[] {fileName}) + EOL );
244
case TGConverter.EXPORTER_NOT_FOUND :
245
message += ( TuxGuitar.getProperty("batch.converter.messages.exporter-not-found", new String[] {fileName}) + EOL );
247
case TGConverter.UNKNOWN_ERROR :
248
message += ( TuxGuitar.getProperty("batch.converter.messages.unknown-error", new String[] {fileName}) + EOL );
252
StyleRange range = new StyleRange();
253
range.foreground = ( code == TGConverter.FILE_OK ? TGConverterProcess.COLOR_INFO : TGConverterProcess.COLOR_ERROR );
254
range.start = TGConverterProcess.this.output.getCharCount();
255
range.length = message.length();
257
TGConverterProcess.this.output.append( message );
258
TGConverterProcess.this.output.setStyleRange(range);