2012-05-20 5 views
0

У меня возникла проблема с изменением поставщика изображений в поставщике эскизов. В случае необходимости я также опубликую View для него.Eclipse RCP ListProvider tweaking

public Object[] getElements(Object inputElement) { 
     if (iDirname == null) 
      return null; 
     File dir = new File(iDirname); 
     FilenameFilter filter = new FilenameFilter() { 
      public boolean accept(File directory, String filename) { 
       if (filename.endsWith("jpg") || (filename.endsWith("bmp")) || (filename.endsWith("png") || (filename.endsWith("JPG") || (filename.endsWith("BMP")) || (filename.endsWith("PNG"))))) 
        return true; 
       else 
        return false; 
      } 
     }; 
     String[] dirList = null; 

     if (dir.isDirectory()) { 
      dirList = dir.list(filter); 
      for (int i=0; i<dirList.length;++i){ 

       //dirList2[i] = new Image(device, dirList2[i]); added this to try passing array of Images - failed. 
       dirList[i] = iDirname + File.separatorChar + dirList[i]; 

      } 
     } 
     return dirList; 
    } 

И вид

public void createPartControl(Composite parent) { 
     iViewer = new ListViewer(parent); 
     iViewer.setContentProvider(new DirListProvider()); 


     getSite().setSelectionProvider(iViewer); 
     makeActions(); 
     hookContextMenu(); 
     contributeToActionBars(); 

    } 

Я не знаю, как изменить предоставленные списки путь к миниатюре отображаются. Должен ли я получить предоставленный контент в Array и повторить его создание изображений? Если да, то как?

Заранее за вашу помощь.

EDIT:

Я добавил

ImageDescriptor[] dirList = null; 
     if (dir.isDirectory()) { 
      String[] dirList2 = dir.list(filter); 
      for (int i=0; i<dirList2.length;++i){ 

       dirList[i] = ImageDescriptor.createFromImageData(new ImageData(iDirname + File.separatorChar + dirList2[i])); 
       //dirList[i] = iDirname + File.separatorChar + dirList[i]; 

      } 
     } 
     return dirList; 

, но это ничего не показывается.

Когда вы говорите мне использовать Composite, это моя родительская переменная? Я до сих пор не знаю, как отображать изображения с пути, пройденного ListProvider. Я действительно зеленый в этом:/

ответ

1

Что вам здесь не хватает - LabelProvider. Вы можете использовать LabelProvider, чтобы предоставить изображение для каждого элемента входа вашего зрителя.

Однако, Фрэнсис Аптон прав, я не думаю, что ListViewer действительно подойдет вашим потребностям, так как в итоге вы получите один столбец изображений. Хотя вы не сможете добавлять изображения непосредственно к своему Composite, вам необходимо установить их в качестве фонового изображения метки.

Есть несколько других вещей, чтобы рассмотреть следующие вопросы:

  • Вы должны dispose() вашего Images как только вы закончите с ними, как они используют системы ручки. Поэтому вам необходимо отслеживать созданные вами изображения в методе getElements(Object).
  • Если каталоги, в которых вы просматриваете изображения, еще не содержат эскизов, вам нужно будет масштабировать изображения перед их представлением в пользовательском интерфейсе.

Помните, что тип массива, возвращаемый из метода getElements (Object) вашего ContentProvider, определяет тип, который будет передан в методы LabelProvider. Таким образом, вы начали возвращать массив строк, представляющих пути к изображениям. Ваш LabelProvider должен будет загрузить их в изображения, которые будут возвращены из метода getImage провайдера, - но помните, что я сказал об утилизации этих изображений! Затем вы переключились на возврат массива дескрипторов изображений, в этом случае вам нужно было бы передать свой входящий объект в ImageDescriptor и использовать его для создания образа в методе getImage.Возможно, если у вас есть эта работа, вы можете подумать о том, соответствует ли это вашим потребностям, а затем, возможно, приступить к выполнению другой реализации, такой как подход composite/gridlayout/label.

+1

+1 приятная дополнительная информация. –

+0

Я думаю, что это то, что я ищу, но 'LabelProvider' отсутствует' GetElements' будет работать так же, как в моем «ListProvider»? – Seb

+0

«LabelProvider» и «ContentProvider» выполняют две отдельные и бесплатные функции - предоставление контента и предоставление текста/значков и т. Д. Для представления этого контента. См .: http://wiki.eclipse.org/FAQ_What_are_content_and_label_providers%3F –

0

Я бы не использовал ListViewer для этого. Я бы просто создал Composite, а затем с помощью GridLayout настроил количество столбцов, которые вы хотите, поля и т. Д., А затем просто добавьте изображения непосредственно в композит. Насколько я знаю, вы не можете ставить произвольные вещи, как воображения, в SWT List, поэтому ListViewer не поможет вам. Вы можете сделать все это в методе createPartControl.

+0

спасибо, я попробую это и напишу ответ. Изменить: смогу ли я получить файлы из каталога, так легко, как с помощью «ListViewer»? – Seb