/*
* LocaleUtilSWT.java
*
* Created on 29. August 2003, 17:32
* Copyright (C) 2003, 2004, 2005, 2006 Aelitis, All Rights Reserved.
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*
* AELITIS, SAS au capital de 46,603.30 euros
* 8 Allee Lenotre, La Grille Royale, 78600 Le Mesnil le Roi, France.
*/
package org.gudy.azureus2.ui.swt;
import java.util.ArrayList;
import java.util.Arrays;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.MouseAdapter;
import org.eclipse.swt.events.MouseEvent;
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.*;
import org.gudy.azureus2.core3.config.COConfigurationManager;
import org.gudy.azureus2.core3.internat.*;
import org.gudy.azureus2.core3.util.AERunnable;
import org.gudy.azureus2.core3.util.Debug;
import com.aelitis.azureus.core.AzureusCore;
/**
*
* @author Tobias Minich
*/
public class
LocaleUtilSWT
implements LocaleUtilListener
{
protected static boolean rememberEncodingDecision = true;
protected static LocaleUtilDecoder rememberedDecoder = null;
protected static Object remembered_on_behalf_of;
public
LocaleUtilSWT(
AzureusCore core )
{
LocaleTorrentUtil.addListener( this );
}
public LocaleUtilDecoderCandidate
selectDecoder(
LocaleUtil locale_util,
Object decision_owner,
LocaleUtilDecoderCandidate[] candidates )
throws LocaleUtilEncodingException
{
if ( decision_owner != remembered_on_behalf_of ){
remembered_on_behalf_of = decision_owner;
rememberedDecoder = null;
}
if( rememberEncodingDecision && rememberedDecoder != null) {
for (int i = 0; i < candidates.length; i++) {
if(candidates[i].getValue() != null && rememberedDecoder == candidates[i].getDecoder()) {
return( candidates[i] );
}
}
}
LocaleUtilDecoderCandidate default_candidate = candidates[0];
String defaultString = candidates[0].getValue();
Arrays.sort(candidates);
boolean always_prompt = COConfigurationManager.getBooleanParameter("File.Decoder.Prompt", false );
if ( !always_prompt ){
int minlength = candidates[0].getValue().length();
// If the default string length == minlength assumes that
// the array encoding is from default charset
if (defaultString != null && defaultString.length() == minlength) {
return( null );
}
// see if we can try and apply a default encoding
String default_name = COConfigurationManager.getStringParameter( "File.Decoder.Default", "" );
if ( default_name.length() > 0 ){
for (int i = 0; i < candidates.length; i++) {
if(candidates[i].getValue() != null && candidates[i].getDecoder().getName().equals( default_name )) {
return( candidates[i] );
}
}
}
}
ArrayList choosableCandidates = new ArrayList();
// Always stick the default candidate in position 0 if valid
if ( defaultString != null ){
choosableCandidates.add( default_candidate );
}
LocaleUtilDecoder[] general_decoders = locale_util.getGeneralDecoders();
// add all general candidates with names not already in the list
for (int j = 0; j < general_decoders.length; j++) {
for (int i = 0; i < candidates.length; i++) {
if (candidates[i].getValue()==null || candidates[i].getDecoder()==null) continue;
if( general_decoders[j] != null &&
general_decoders[j].getName().equals(candidates[i].getDecoder().getName())){
if (!choosableCandidates.contains(candidates[i])) {
choosableCandidates.add(candidates[i]);
break;
}
}
}
}
// add the remaining possible locales
for (int i = 0; i < candidates.length; i++){
if (candidates[i].getValue()==null || candidates[i].getDecoder()==null) continue;
if (!choosableCandidates.contains(candidates[i])){
choosableCandidates.add(candidates[i]);
}
}
final LocaleUtilDecoderCandidate[] candidatesToChoose = (LocaleUtilDecoderCandidate[]) choosableCandidates.toArray(new LocaleUtilDecoderCandidate[choosableCandidates.size()]);
final LocaleUtilDecoderCandidate[] selected_candidate = {null};
// Run Synchronously, since we want the results
Utils.execSWTThread(new AERunnable() {
public void runSupport() {
try{
showChoosableEncodingWindow(Utils.findAnyShell(),
candidatesToChoose,selected_candidate);
}catch( Throwable e ){
Debug.printStackTrace( e );
}
}
}, false);
if ( selected_candidate[0] == null ){
throw( new LocaleUtilEncodingException( true ));
}else{
return ( selected_candidate[0] );
}
}
private void
showChoosableEncodingWindow(
final Shell shell,
final LocaleUtilDecoderCandidate[] candidates,
final LocaleUtilDecoderCandidate[] selected_candidate )
{
final Shell s = org.gudy.azureus2.ui.swt.components.shell.ShellFactory
.createShell(shell, SWT.RESIZE | SWT.DIALOG_TRIM | SWT.PRIMARY_MODAL);
Utils.setShellIcon(s);
s.setText(MessageText.getString("LocaleUtil.title")); //$NON-NLS-1$
GridData gridData;
s.setLayout(new GridLayout(1, true));
Label label = new Label(s, SWT.LEFT);
Messages.setLanguageText(label, "LocaleUtil.label.chooseencoding"); //$NON-NLS-1$
final Table table = new Table(s, SWT.SINGLE | SWT.FULL_SELECTION | SWT.BORDER | SWT.V_SCROLL);
gridData = new GridData( GridData.FILL_BOTH );
table.setLayoutData(gridData);
table.setLinesVisible(true);
table.setHeaderVisible(true);
String[] titlesPieces = { "encoding", "text" };
for (int i = 0; i < titlesPieces.length; i++) {
TableColumn column = new TableColumn(table, SWT.LEFT);
Messages.setLanguageText(column, "LocaleUtil.column." + titlesPieces[i]);
}
// add candidates to table
for (int i = 0; i < candidates.length; i++) {
TableItem item = new TableItem(table, SWT.NULL);
String name = candidates[i].getDecoder().getName();
item.setText(0, name);
item.setText(1, candidates[i].getValue());
}
int lastSelectedIndex = 0;
for (int i = 1; i < candidates.length; i++) {
if(candidates[i].getValue() != null && candidates[i].getDecoder() == rememberedDecoder ) {
lastSelectedIndex = i;
break;
}
}
table.select(lastSelectedIndex);
// resize all columns to fit the widest entry
table.getColumn(0).pack();
table.getColumn(1).pack();
label = new Label(s, SWT.LEFT);
Messages.setLanguageText(label, "LocaleUtil.label.hint.doubleclick"); //$NON-NLS-1$
Composite composite = new Composite(s,SWT.NULL);
gridData = new GridData(GridData.FILL_HORIZONTAL);
composite.setLayoutData(gridData);
GridLayout subLayout = new GridLayout();
subLayout.numColumns = 2;
composite.setLayout(subLayout);
final Button checkBox = new Button(composite, SWT.CHECK);
checkBox.setLayoutData(new GridData(GridData.HORIZONTAL_ALIGN_BEGINNING));
checkBox.setSelection(rememberEncodingDecision);
Messages.setLanguageText(checkBox, "LocaleUtil.label.checkbox.rememberdecision"); //$NON-NLS-1$, "LocaleUtil.label.checkbox.rememberdecision"); //$NON-NLS-1$
final Button ok = new Button(composite, SWT.PUSH);
ok.setText(" ".concat(MessageText.getString("Button.next")).concat(" ")); //$NON-NLS-1$ //$NON-NLS-3$ //$NON-NLS-2$
gridData = new GridData(GridData.END);
gridData.widthHint = 100;
ok.setLayoutData(gridData);
s.setSize(500,500);
s.layout();
Utils.centreWindow(s);
ok.addSelectionListener(new SelectionAdapter() {
public void widgetSelected(SelectionEvent event) {
//abandonSelection(s);
setSelectedIndex(s, table, checkBox, candidates,selected_candidate);
s.dispose();
}
});
table.addMouseListener(new MouseAdapter() {
public void mouseDoubleClick(MouseEvent mEvent) {
setSelectedIndex(s, table, checkBox, candidates,selected_candidate);
s.dispose();
}
});
s.open();
while (!s.isDisposed()) {
if (!s.getDisplay().readAndDispatch()) {
s.getDisplay().sleep();
}
}
}
private void
setSelectedIndex(
final Shell s,
final Table table,
final Button checkBox,
LocaleUtilDecoderCandidate[] candidates,
LocaleUtilDecoderCandidate[] selected_candidate )
{
int selectedIndex = table.getSelectionIndex();
if(-1 == selectedIndex)
return;
rememberEncodingDecision = checkBox.getSelection();
selected_candidate[0] = candidates[selectedIndex];
if ( rememberEncodingDecision ){
rememberedDecoder = selected_candidate[0].getDecoder();
}else{
rememberedDecoder = null;
}
s.dispose();
}
private void
abandonSelection(
final Shell s)
{
s.dispose();
}
}