package org.herac.tuxguitar.gui.tools.custom.converter; import org.apache.log4j.Logger; import org.eclipse.swt.SWT; import org.eclipse.swt.custom.StyleRange; import org.eclipse.swt.custom.StyledText; import org.eclipse.swt.events.DisposeEvent; import org.eclipse.swt.events.DisposeListener; import org.eclipse.swt.events.SelectionAdapter; import org.eclipse.swt.events.SelectionEvent; import org.eclipse.swt.events.ShellAdapter; import org.eclipse.swt.events.ShellEvent; import org.eclipse.swt.graphics.Color; 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.Shell; import org.herac.tuxguitar.gui.TuxGuitar; import org.herac.tuxguitar.gui.editors.chord.ChordSelector; import org.herac.tuxguitar.gui.system.icons.IconLoader; import org.herac.tuxguitar.gui.system.language.LanguageLoader; import org.herac.tuxguitar.gui.util.DialogUtils; import org.herac.tuxguitar.util.TGSynchronizer; public class TGConverterProcess implements TGConverterListener, LanguageLoader, IconLoader { protected static final Color COLOR_ERROR = TuxGuitar.instance().getDisplay() .getSystemColor(SWT.COLOR_RED); protected static final Color COLOR_INFO = TuxGuitar.instance().getDisplay() .getSystemColor(SWT.COLOR_BLUE); protected static final String EOL = ("\n"); /** The Logger for this class. */ public static final transient Logger LOG = Logger .getLogger(TGConverterProcess.class); private static final int SHELL_HEIGHT = 350; private static final int SHELL_WIDTH = 650; protected Button buttonCancel; protected Button buttonClose; protected TGConverter converter; protected Shell dialog; protected boolean finished; protected StyledText output; protected void appendLogMessage(int result, String fileName) { String message = (TuxGuitar.getProperty("batch.converter.messages." + (result == TGConverter.FILE_OK ? "ok" : "failed")) + EOL); switch (result) { case TGConverter.FILE_COULDNT_WRITE: message += (TuxGuitar.getProperty( "batch.converter.messages.couldnt-write", new String[] { fileName }) + EOL); break; case TGConverter.FILE_BAD: message += (TuxGuitar.getProperty("batch.converter.messages.bad-file", new String[] { fileName }) + EOL); break; case TGConverter.FILE_NOT_FOUND: message += (TuxGuitar.getProperty( "batch.converter.messages.file-not-found", new String[] { fileName }) + EOL); break; case TGConverter.OUT_OF_MEMORY: message += (TuxGuitar.getProperty( "batch.converter.messages.out-of-memory", new String[] { fileName }) + EOL); break; case TGConverter.EXPORTER_NOT_FOUND: message += (TuxGuitar.getProperty( "batch.converter.messages.exporter-not-found", new String[] { fileName }) + EOL); break; case TGConverter.UNKNOWN_ERROR: message += (TuxGuitar.getProperty( "batch.converter.messages.unknown-error", new String[] { fileName }) + EOL); break; } StyleRange range = new StyleRange(); range.foreground = (result == TGConverter.FILE_OK ? TGConverterProcess.COLOR_INFO : TGConverterProcess.COLOR_ERROR); range.start = TGConverterProcess.this.output.getCharCount(); range.length = message.length(); TGConverterProcess.this.output.append(message); TGConverterProcess.this.output.setStyleRange(range); } private GridData getButtonsData() { GridData data = new GridData(SWT.FILL, SWT.FILL, true, true); data.minimumWidth = 80; data.minimumHeight = 25; return data; } public boolean isDisposed() { return (this.dialog == null || this.dialog.isDisposed()); } public void loadIcons() { this.loadIcons(true); } public void loadIcons(boolean layout) { if (!isDisposed()) { this.dialog.setImage(TuxGuitar.instance().getIconManager().getAppIcon()); if (layout) { this.dialog.layout(true, true); } } } public void loadProperties() { this.loadProperties(true); } public void loadProperties(boolean layout) { if (!isDisposed()) { this.dialog.setText(TuxGuitar.getProperty("batch.converter")); this.buttonCancel.setText(TuxGuitar.getProperty("cancel")); this.buttonClose.setText(TuxGuitar.getProperty("close")); if (layout) { this.dialog.layout(true, true); } } } public void notifyFileProcess(final String filename) { if (!isDisposed()) { try { TGSynchronizer.instance().addRunnable(new TGSynchronizer.TGRunnable() { public void run() { if (!isDisposed()) { TGConverterProcess.this.output.append(TuxGuitar.getProperty( "batch.converter.messages.converting", new String[] { filename })); TGConverterProcess.this.output .setSelection(TGConverterProcess.this.output.getCharCount()); } } }); } catch (Throwable e) { LOG.error(e); } } } // ------------------------------------------------------------------------------------------------// // ---TGConverterListener Implementation // ----------------------------------------------------------// // ------------------------------------------------------------------------------------------------// public void notifyFileResult(final String filename, final int result) { if (!isDisposed()) { try { TGSynchronizer.instance().addRunnable(new TGSynchronizer.TGRunnable() { public void run() { if (!isDisposed()) { TGConverterProcess.this.appendLogMessage(result, filename); TGConverterProcess.this.output .setSelection(TGConverterProcess.this.output.getCharCount()); } } }); } catch (Throwable e) { LOG.error(e); } } } public void notifyFinish() { if (!isDisposed()) { try { TGSynchronizer.instance().addRunnable(new TGSynchronizer.TGRunnable() { public void run() { if (!isDisposed()) { TGConverterProcess.this.finished = true; TGConverterProcess.this.buttonClose .setEnabled(TGConverterProcess.this.finished); TGConverterProcess.this.buttonCancel .setEnabled(!TGConverterProcess.this.finished); TGConverterProcess.this.output .setCursor(TGConverterProcess.this.dialog.getDisplay() .getSystemCursor(SWT.CURSOR_ARROW)); } } }); } catch (Throwable e) { LOG.error(e); } } } public void notifyStart() { if (!isDisposed()) { try { TGSynchronizer.instance().addRunnable(new TGSynchronizer.TGRunnable() { public void run() { if (!isDisposed()) { TGConverterProcess.this.finished = false; TGConverterProcess.this.buttonClose .setEnabled(TGConverterProcess.this.finished); TGConverterProcess.this.buttonCancel .setEnabled(!TGConverterProcess.this.finished); TGConverterProcess.this.output .setCursor(TGConverterProcess.this.dialog.getDisplay() .getSystemCursor(SWT.CURSOR_WAIT)); } } }); } catch (Throwable e) { LOG.error(e); } } } protected void showProcess() { this.finished = false; this.dialog = DialogUtils.newDialog(TuxGuitar.instance().getShell(), SWT.SHELL_TRIM); this.dialog.setLayout(new GridLayout()); this.dialog.setSize(SHELL_WIDTH, SHELL_HEIGHT); this.dialog.addDisposeListener(new DisposeListener() { public void widgetDisposed(DisposeEvent e) { TuxGuitar.instance().getIconManager().removeLoader( TGConverterProcess.this); TuxGuitar.instance().getLanguageManager().removeLoader( TGConverterProcess.this); } }); this.dialog.addShellListener(new ShellAdapter() { public void shellClosed(ShellEvent e) { e.doit = TGConverterProcess.this.finished; } }); Composite composite = new Composite(this.dialog, SWT.NONE); composite.setLayout(new GridLayout()); composite.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true)); this.output = new StyledText(composite, SWT.BORDER | SWT.MULTI | SWT.V_SCROLL | SWT.H_SCROLL); this.output.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true)); this.output.setEditable(false); // ------------------BUTTONS-------------------------- Composite buttons = new Composite(this.dialog, SWT.NONE); buttons.setLayout(new GridLayout(2, false)); buttons.setLayoutData(new GridData(SWT.RIGHT, SWT.BOTTOM, true, false)); this.buttonCancel = new Button(buttons, SWT.PUSH); this.buttonCancel.setEnabled(false); this.buttonCancel.setLayoutData(getButtonsData()); this.buttonCancel.addSelectionListener(new SelectionAdapter() { public void widgetSelected(SelectionEvent arg0) { TGConverterProcess.this.converter.setCancelled(true); } }); this.buttonClose = new Button(buttons, SWT.PUSH); this.buttonClose.setEnabled(false); this.buttonClose.setLayoutData(getButtonsData()); this.buttonClose.addSelectionListener(new SelectionAdapter() { public void widgetSelected(SelectionEvent arg0) { TGConverterProcess.this.dialog.dispose(); } }); this.loadIcons(false); this.loadProperties(false); TuxGuitar.instance().getIconManager().addLoader(this); TuxGuitar.instance().getLanguageManager().addLoader(this); DialogUtils.openDialog(this.dialog, DialogUtils.OPEN_STYLE_CENTER); } public void start(final String initFolder, String destFolder, TGConverterFormat format) { this.converter = new TGConverter(initFolder, destFolder); this.converter.setFormat(format); this.converter.setListener(this); this.showProcess(); new Thread(new Runnable() { public void run() { TGConverterProcess.this.converter.process(); } }).start(); } }