| /* |
| * Copyright (C) 2014 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| package com.android.tools.idea.editors.strings.table; |
| |
| import com.android.tools.idea.rendering.Locale; |
| import com.intellij.ui.BooleanTableCellRenderer; |
| import org.jetbrains.annotations.NotNull; |
| |
| import javax.swing.*; |
| import javax.swing.table.TableCellRenderer; |
| import javax.swing.table.TableColumn; |
| import java.awt.*; |
| import java.util.*; |
| |
| public class ColumnUtil { |
| private static final TableCellRenderer CELL_RENDERER = new StringsCellRenderer(); |
| |
| public static void setColumns(@NotNull JTable table) { |
| StringResourceTableModel model = (StringResourceTableModel) table.getModel(); |
| |
| Enumeration<TableColumn> columns = table.getColumnModel().getColumns(); |
| while (columns.hasMoreElements()) { |
| TableColumn column = columns.nextElement(); |
| if (column.getModelIndex() == ConstantColumn.UNTRANSLATABLE.ordinal()) { |
| column.setCellRenderer(new BooleanTableCellRenderer()); |
| } |
| else { |
| column.setCellRenderer(CELL_RENDERER); |
| } |
| int index = column.getModelIndex(); |
| FontMetrics fontMetrics = table.getFontMetrics(table.getFont()); |
| Locale locale = model.localeOfColumn(index); |
| HeaderCellRenderer renderer = |
| locale == null ? new ConstantHeaderCellRenderer(index, fontMetrics) : new TranslationHeaderCellRenderer(fontMetrics, locale); |
| column.setHeaderRenderer(renderer); |
| // Sets Key and Default Value columns to initially display at full width and all others to be collapsed |
| int width; |
| if (ConstantColumn.KEY.ordinal() == index || |
| ConstantColumn.DEFAULT_VALUE.ordinal() == index) { |
| width = renderer.getFullExpandedWidth(); |
| } else { |
| width = renderer.getCollapsedWidth(); |
| } |
| setPreferredWidth(column, width); |
| } |
| |
| expandToViewportWidthIfNecessary(table, -1); |
| } |
| |
| /** |
| * Returns the additional width needed for the table to fill its viewport. A value <= 0 indicates that the table is sufficiently wide. |
| */ |
| static int getAdditionalWidthToFillViewport(@NotNull JTable table) { |
| return table.getParent().getWidth() - table.getPreferredSize().width; |
| } |
| |
| /** |
| * Expands the table to fill its viewport horizontally by distributing extra width among the columns except the one at ignoreIndex. |
| * Caller should pass in -1 for ignoreIndex to specify that this method can touch all of the columns. |
| */ |
| static void expandToViewportWidthIfNecessary(@NotNull JTable table, int ignoreIndex) { |
| if (table.getColumnModel().getColumnCount() < ConstantColumn.COUNT) { |
| // Table has no data |
| return; |
| } |
| int widthToFillViewport = getAdditionalWidthToFillViewport(table); |
| if (widthToFillViewport <= 0) { |
| // Table already fills viewport |
| return; |
| } |
| |
| int totalNumColumns = table.getColumnModel().getColumnCount(); |
| int numColumnsForDistribution = totalNumColumns - ConstantColumn.COUNT; |
| if (ConstantColumn.COUNT <= ignoreIndex && ignoreIndex < totalNumColumns) { |
| --numColumnsForDistribution; |
| } |
| if (numColumnsForDistribution == 0) { |
| // No translation columns among which to distribute extra width |
| TableColumn column = table.getColumn(ConstantColumn.DEFAULT_VALUE.name); |
| setPreferredWidth(column, column.getPreferredWidth() + widthToFillViewport); |
| return; |
| } |
| int extraWidth = widthToFillViewport / numColumnsForDistribution; |
| for (int i = ConstantColumn.COUNT; i < totalNumColumns; ++i) { |
| if (i == ignoreIndex) { |
| continue; |
| } |
| TableColumn column = table.getColumnModel().getColumn(i); |
| setPreferredWidth(column, column.getPreferredWidth() + extraWidth); |
| widthToFillViewport -= extraWidth; |
| } |
| // Might still be under width because of integer division |
| int resizeIndex = totalNumColumns - 1; |
| if (resizeIndex == ignoreIndex) { |
| --resizeIndex; |
| } |
| TableColumn column = table.getColumnModel().getColumn(resizeIndex); |
| setPreferredWidth(column, column.getPreferredWidth() + widthToFillViewport); |
| } |
| |
| /** |
| * Sets the width of a column, switching between brief and full column names if necessary. |
| * Whenever possible, should be used in place of a direct call to column.setPreferredWidth(width). |
| */ |
| static void setPreferredWidth(@NotNull TableColumn column, int width) { |
| column.setPreferredWidth(width); |
| toggleColumnNameIfApplicable(column); |
| } |
| |
| private static void toggleColumnNameIfApplicable(@NotNull TableColumn column) { |
| if (column.getHeaderRenderer() instanceof TranslationHeaderCellRenderer) { |
| TranslationHeaderCellRenderer renderer = (TranslationHeaderCellRenderer) column.getHeaderRenderer(); |
| renderer.setUseBriefName(column.getPreferredWidth() < renderer.getMinimumExpandedWidth()); |
| } |
| } |
| } |