Package org.gudy.azureus2.ui.swt

Source Code of org.gudy.azureus2.ui.swt.LocaleUtilSWT

/*
* 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();
  }
}
TOP

Related Classes of org.gudy.azureus2.ui.swt.LocaleUtilSWT

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.