Поиск по этому блогу

понедельник, 14 июля 2014 г.

Guava. Filter Collections and Iterables

Guava - это библиотека, предоставляющая возможности функционального программирования.

Guava на Google Code

Guava на Wikipedia

Зависимость в POM.XML файле проекта (Если используем Maven для проекта)
<dependency>
  <groupId>com.google.guava</groupId>
  <artifactId>guava</artifactId>
  <version>${guavaVersion}</version>
</dependency>


Фильтруем List

Для фильтрации List'a следующие классы необходимо импортировать.
import com.google.common.base.Predicate;
import com.google.common.collect.Collections2;
import com.google.common.collect.Lists;

Объявляем объект, реализующий интерфейс List.
private List<Document> displayList;

Фильтруем наш displayList. Создаем новый лист на основе исходного, но при этом в новый лист попадут только те элементы которые будут соответствовать условию, указанному в предикате. Например, тут в листе будут содержаться только не архивные документы.
displayList = Lists.newArrayList(
    Collections2.filter(displayList, new Predicate<Document>() { 
 
      @Override
      public boolean apply(Document document) {
        return !document.isArchived();
      }
    })
);
 
setupView(displayList);

Фильтруем Iterables

Для фильтрации Iterables следующие классы необходимо импортировать.
import com.google.common.base.Predicate;
import com.google.common.collect.Iterables;
import com.google.common.collect.Lists;

Создаем список реализующий интерфейс List, он будет содержать объекты класса SchemaItem.
private List<SchemaItem> attributeList;

Допустим у нас есть объект класса Schema, который содержит в себе объекты SchemaItem и реализует интерфейс Iterable.
public class Schema implements Iterable<SchemaItem>

Фильтрованный лист будет создан на основе объекта реализующего интерфейс Iterable и содержащего объекты класса SchemaItem. В него попадут только те элементы, которые будут соответствовать условию в предикате.
attributeList = Lists.newArrayList(
  Iterables.filter(result, new Predicate<SchemaItem>() { 
 
    @Override
    public boolean apply(SchemaItem si) {
      return (si.getSearchable());
    }
  ));
setupView(attributeList);

пятница, 11 июля 2014 г.

Становимся экспертами в GWT или GWT in Action

Очень познавательная книжка по технологии GWT. Подойдет для всех категорий читателей, как для тех, кто уже знаком с GWT и хочет разобраться поглубже, так и для тех, кто будет изучать GWT с нуля.

GWT in Action, Second Edition




GWT. Maven GWT Plugin commands


1. GWT Maven Plugin 

    http://mojo.codehaus.org/gwt-maven-plugin/

Этот плагин предназначен для запуска gwt проектов с помощью Maven.

<groupId>org.codehaus.mojo</groupId>
<artifactId>gwt-maven-plugin</artifactId>
<version>${gwtVersion}</version>

1. mvn gwt:eclipse создаст Launch файл для запуска проект из Eclipse

2. mvn gwt:run запустит проект на AppEngine

3. mvn gwt:debug запустит проект на AppEngine в debug mode



2. Appengine Maven Plugin 



Этот плагин предназначен для запуска с помощью Maven сервера AppEngine
   
<groupId>com.google.appengine</groupId>
<artifactId>appengine-maven-plugin</artifactId>
<version>${appengine.target.version}</version>

1. mvn appengine:devserver эта команда запустит локальный dev сервер AppEngine 

2. mvn appengine:devserver -Plocal эта команда запустит локальный dev сервер AppEngine с профилем local, профиль local описывается в POM файле проекта.
<profiles>
  <profile>
    <id>local</id>
      <properties>
        <root.url>http:\/\/localhost:8888</root.url>
      </properties>
  </profile>
</profiles>

3. Профили и параметры Maven


1. mvn clean install -DskipTests  эта команда очистит папку target проекта, после чего скомпилирует файлы проекта и при этом пропустит выполнение тестов.

2. mvn clean install -DskipTests -Pdebugging -DgwtLogLevel=INFO для того, чтобы выполнилась такая команда необходимо добавить профиль в POM файл проекта для параметра Pdebugging, другие два параметра являются параметрами встроенными в Maven.
<profiles>
<profile>
  <id>debugging</id>
    <properties>
      // уровень логгирования
      <gwtLogLevel>TRACE</gwtLogLevel>
      // количество выделяемой памяти
      <gwtDebugJvm>-Xmx2048m -XX:MaxPermSize=2048m</gwtDebugJvm>
      // пропустить тесты
      <skipTests>true</skipTests>
    </properties>
  </profile>
<profile>
</profiles>

CSS. How to center div inside div

Для div элемента, который будет выравниваться по центру другого div элемента, необходимо прописать следующий стиль

margin: 0 auto;

<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<body>
    <div style="width: 100%;">
     <div style="margin: 0 auto;">
      Test
     </div>
    </div>
</body>
</html>

Mac OS X Как открыть Android SDK manager

Для того, чтобы в Eclipse добавить в панель инструментов кнопки Android SDK и AVD необходимо нажать в меню Window > Customize perspective, после чего выбрать вкладку Command Groups Availability. Здесь необходимо поставить галочку  Android SDK and AVD Manager и нажать кнопку ОК

вторник, 1 июля 2014 г.

GWT. Programatically selecting text in a TextBox

Для того, чтобы по нажатию на компонент выделить текст, который в нем находится, необходимо написать следующий нативный метод. В качестве параметра передаем в метод тот элемент, в котором будем выделять текст.
private native void selectAll(Element element) /*-{
     element.setSelectionRange(0, element.value.length);
}-*/;

И использовать этот метод в обработчике события получения фокуса компонентом.
Event.sinkEvents(selector.getInputElement(), Event.ONFOCUS);
Event.setEventListener(selector.getInputElement(), 
  new EventListener() {
 
    @Override
    public void onBrowserEvent(Event event) {
      selectAll(selector.getInputElement());
    }
});

Но часто может происходить следующая ситуация - текст в компоненте будет выделяться после того как пользователь поставит курсор внутри компонента, однако после этого выделение будет слетать. Это происходит потому что выделение может быть установлено еще до того как выполнятся все события связанные с отрисовкой интерфейса. Поэтому необходимо использовать очередь событий и вызывать метод, который будет выделять текст только после того как все события интерфейса будут выполнены. Для этого нам понадобится метод
Scheduler.get().scheduleDeferred() 

Добавим в очередь событий вызов метода выделения текста в компоненте.
Scheduler.get().scheduleDeferred(
  new Scheduler.ScheduledCommand() {
    public void execute() {
      selectAll(selector.getInputElement());
    }
});

Полностью код будет выглядеть так
Event.sinkEvents(selector.getInputElement(), Event.ONFOCUS);
Event.setEventListener(selector.getInputElement(), 
  new EventListener() {
    @Override
    public void onBrowserEvent(Event event) {
      openDropdown(true);
      currentValue = selector.getText();
      Scheduler.get().scheduleDeferred(
        new Scheduler.ScheduledCommand() {
          public void execute() {
            selectAll(selector.getInputElement());
          }
        });
      }
  });