package org.archstudio.swtutils; /* * This class is from the book Eclipse: Building Commercial-Quality Plug-ins by Eric Clayberg and Dan Rubel. It is used * under license. * * It is licensed under the CPL, which is reproduced here: * * * Common Public License - v 1.0 * * * THE ACCOMPANYING PROGRAM IS PROVIDED UNDER THE TERMS OF THIS COMMON PUBLIC LICENSE ("AGREEMENT"). ANY USE, * REPRODUCTION OR DISTRIBUTION OF THE PROGRAM CONSTITUTES RECIPIENT'S ACCEPTANCE OF THIS AGREEMENT. * * * 1. DEFINITIONS * * "Contribution" means: * * a) in the case of the initial Contributor, the initial code and documentation distributed under this Agreement, and * b) in the case of each subsequent Contributor: i) changes to the Program, and ii) additions to the Program; where * such changes and/or additions to the Program originate from and are distributed by that particular Contributor. A * Contribution 'originates' from a Contributor if it was added to the Program by such Contributor itself or anyone * acting on such Contributor's behalf. Contributions do not include additions to the Program which: (i) are separate * modules of software distributed in conjunction with the Program under their own license agreement, and (ii) are not * derivative works of the Program. * * "Contributor" means any person or entity that distributes the Program. * * * "Licensed Patents " mean patent claims licensable by a Contributor which are necessarily infringed by the use or sale * of its Contribution alone or when combined with the Program. * * * "Program" means the Contributions distributed in accordance with this Agreement. * * * "Recipient" means anyone who receives the Program under this Agreement, including all Contributors. * * * 2. GRANT OF RIGHTS * * a) Subject to the terms of this Agreement, each Contributor hereby grants Recipient a non-exclusive, worldwide, * royalty-free copyright license to reproduce, prepare derivative works of, publicly display, publicly perform, * distribute and sublicense the Contribution of such Contributor, if any, and such derivative works, in source code and * object code form. b) Subject to the terms of this Agreement, each Contributor hereby grants Recipient a * non-exclusive, worldwide, royalty-free patent license under Licensed Patents to make, use, sell, offer to sell, * import and otherwise transfer the Contribution of such Contributor, if any, in source code and object code form. This * patent license shall apply to the combination of the Contribution and the Program if, at the time the Contribution is * added by the Contributor, such addition of the Contribution causes such combination to be covered by the Licensed * Patents. The patent license shall not apply to any other combinations which include the Contribution. No hardware per * se is licensed hereunder. c) Recipient understands that although each Contributor grants the licenses to its * Contributions set forth herein, no assurances are provided by any Contributor that the Program does not infringe the * patent or other intellectual property rights of any other entity. Each Contributor disclaims any liability to * Recipient for claims brought by any other entity based on infringement of intellectual property rights or otherwise. * As a condition to exercising the rights and licenses granted hereunder, each Recipient hereby assumes sole * responsibility to secure any other intellectual property rights needed, if any. For example, if a third party patent * license is required to allow Recipient to distribute the Program, it is Recipient's responsibility to acquire that * license before distributing the Program. d) Each Contributor represents that to its knowledge it has sufficient * copyright rights in its Contribution, if any, to grant the copyright license set forth in this Agreement. 3. * REQUIREMENTS * * A Contributor may choose to distribute the Program in object code form under its own license agreement, provided * that: * * a) it complies with the terms and conditions of this Agreement; and b) its license agreement: i) effectively * disclaims on behalf of all Contributors all warranties and conditions, express and implied, including warranties or * conditions of title and non-infringement, and implied warranties or conditions of merchantability and fitness for a * particular purpose; ii) effectively excludes on behalf of all Contributors all liability for damages, including * direct, indirect, special, incidental and consequential damages, such as lost profits; iii) states that any * provisions which differ from this Agreement are offered by that Contributor alone and not by any other party; and iv) * states that source code for the Program is available from such Contributor, and informs licensees how to obtain it in * a reasonable manner on or through a medium customarily used for software exchange. When the Program is made available * in source code form: * * a) it must be made available under this Agreement; and b) a copy of this Agreement must be included with each copy of * the Program. * * Contributors may not remove or alter any copyright notices contained within the Program. * * * Each Contributor must identify itself as the originator of its Contribution, if any, in a manner that reasonably * allows subsequent Recipients to identify the originator of the Contribution. * * * 4. COMMERCIAL DISTRIBUTION * * Commercial distributors of software may accept certain responsibilities with respect to end users, business partners * and the like. While this license is intended to facilitate the commercial use of the Program, the Contributor who * includes the Program in a commercial product offering should do so in a manner which does not create potential * liability for other Contributors. Therefore, if a Contributor includes the Program in a commercial product offering, * such Contributor ("Commercial Contributor") hereby agrees to defend and indemnify every other Contributor * ("Indemnified Contributor") against any losses, damages and costs (collectively "Losses") arising from claims, * lawsuits and other legal actions brought by a third party against the Indemnified Contributor to the extent caused by * the acts or omissions of such Commercial Contributor in connection with its distribution of the Program in a * commercial product offering. The obligations in this section do not apply to any claims or Losses relating to any * actual or alleged intellectual property infringement. In order to qualify, an Indemnified Contributor must: a) * promptly notify the Commercial Contributor in writing of such claim, and b) allow the Commercial Contributor to * control, and cooperate with the Commercial Contributor in, the defense and any related settlement negotiations. The * Indemnified Contributor may participate in any such claim at its own expense. * * * For example, a Contributor might include the Program in a commercial product offering, Product X. That Contributor is * then a Commercial Contributor. If that Commercial Contributor then makes performance claims, or offers warranties * related to Product X, those performance claims and warranties are such Commercial Contributor's responsibility alone. * Under this section, the Commercial Contributor would have to defend claims against the other Contributors related to * those performance claims and warranties, and if a court requires any other Contributor to pay any damages as a * result, the Commercial Contributor must pay those damages. * * * 5. NO WARRANTY * * EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, THE PROGRAM IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OR * CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED INCLUDING, WITHOUT LIMITATION, ANY WARRANTIES OR CONDITIONS OF * TITLE, NON-INFRINGEMENT, MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Each Recipient is solely responsible * for determining the appropriateness of using and distributing the Program and assumes all risks associated with its * exercise of rights under this Agreement, including but not limited to the risks and costs of program errors, * compliance with applicable laws, damage to or loss of data, programs or equipment, and unavailability or interruption * of operations. * * * 6. DISCLAIMER OF LIABILITY * * EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, NEITHER RECIPIENT NOR ANY CONTRIBUTORS SHALL HAVE ANY LIABILITY FOR * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING WITHOUT LIMITATION LOST * PROFITS), HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OR DISTRIBUTION OF THE PROGRAM OR THE EXERCISE OF ANY * RIGHTS GRANTED HEREUNDER, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. * * * 7. GENERAL * * If any provision of this Agreement is invalid or unenforceable under applicable law, it shall not affect the validity * or enforceability of the remainder of the terms of this Agreement, and without further action by the parties hereto, * such provision shall be reformed to the minimum extent necessary to make such provision valid and enforceable. * * * If Recipient institutes patent litigation against a Contributor with respect to a patent applicable to software * (including a cross-claim or counterclaim in a lawsuit), then any patent licenses granted by that Contributor to such * Recipient under this Agreement shall terminate as of the date such litigation is filed. In addition, if Recipient * institutes patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that * the Program itself (excluding combinations of the Program with other software or hardware) infringes such Recipient's * patent(s), then such Recipient's rights granted under Section 2(b) shall terminate as of the date such litigation is * filed. * * * All Recipient's rights under this Agreement shall terminate if it fails to comply with any of the material terms or * conditions of this Agreement and does not cure such failure in a reasonable period of time after becoming aware of * such noncompliance. If all Recipient's rights under this Agreement terminate, Recipient agrees to cease use and * distribution of the Program as soon as reasonably practicable. However, Recipient's obligations under this Agreement * and any licenses granted by Recipient relating to the Program shall continue and survive. * * * Everyone is permitted to copy and distribute copies of this Agreement, but in order to avoid inconsistency the * Agreement is copyrighted and may only be modified in the following manner. The Agreement Steward reserves the right * to publish new versions (including revisions) of this Agreement from time to time. No one other than the Agreement * Steward has the right to modify this Agreement. IBM is the initial Agreement Steward. IBM may assign the * responsibility to serve as the Agreement Steward to a suitable separate entity. Each new version of the Agreement * will be given a distinguishing version number. The Program (including Contributions) may always be distributed * subject to the version of the Agreement under which it was received. In addition, after a new version of the * Agreement is published, Contributor may elect to distribute the Program (including its Contributions) under the new * version. Except as expressly stated in Sections 2(a) and 2(b) above, Recipient receives no rights or licenses to the * intellectual property of any Contributor under this Agreement, whether expressly, by implication, estoppel or * otherwise. All rights in the Program not expressly granted under this Agreement are reserved. * * * This Agreement is governed by the laws of the State of New York and the intellectual property laws of the United * States of America. No party to this Agreement will bring a legal action under this Agreement more than one year after * the cause of action arose. Each party waives its rights to a jury trial in any resulting litigation. */ import java.util.ArrayList; import org.eclipse.jface.viewers.ColumnLayoutData; import org.eclipse.jface.viewers.ColumnPixelData; import org.eclipse.jface.viewers.ColumnWeightData; import org.eclipse.jface.viewers.TableLayout; import org.eclipse.swt.events.ControlEvent; import org.eclipse.swt.events.ControlListener; import org.eclipse.swt.widgets.Table; import org.eclipse.swt.widgets.TableColumn; public class AutoResizeTableLayout extends TableLayout implements ControlListener { private final Table table; private final java.util.List<ColumnLayoutData> columns = new ArrayList<ColumnLayoutData>(); private boolean autosizing = false; public AutoResizeTableLayout(Table table) { this.table = table; table.addControlListener(this); } @Override public void addColumnData(ColumnLayoutData data) { columns.add(data); super.addColumnData(data); } @Override public void controlMoved(ControlEvent e) { } @Override public void controlResized(ControlEvent e) { if (autosizing) { return; } autosizing = true; try { autoSizeColumns(); } finally { autosizing = false; } } private void autoSizeColumns() { int width = table.getClientArea().width; // XXX: Layout is being called with an invalid value // the first time it is being called on Linux. // This method resets the layout to null, // so we run it only when the value is OK. if (width <= 1) { return; } TableColumn[] tableColumns = table.getColumns(); int size = Math.min(columns.size(), tableColumns.length); int[] widths = new int[size]; int fixedWidth = 0; int numberOfWeightColumns = 0; int totalWeight = 0; // First calc space occupied by fixed columns. for (int i = 0; i < size; i++) { ColumnLayoutData col = columns.get(i); if (col instanceof ColumnPixelData) { int pixels = ((ColumnPixelData) col).width; widths[i] = pixels; fixedWidth += pixels; } else if (col instanceof ColumnWeightData) { ColumnWeightData cw = (ColumnWeightData) col; numberOfWeightColumns++; int weight = cw.weight; totalWeight += weight; } else { throw new IllegalStateException("Unknown column layout data"); } } // Do we have columns that have a weight? if (numberOfWeightColumns > 0) { // Now, distribute the rest // to the columns with weight. int rest = width - fixedWidth; int totalDistributed = 0; for (int i = 0; i < size; i++) { ColumnLayoutData col = columns.get(i); if (col instanceof ColumnWeightData) { ColumnWeightData cw = (ColumnWeightData) col; int weight = cw.weight; int pixels = totalWeight == 0 ? 0 : weight * rest / totalWeight; if (pixels < cw.minimumWidth) { pixels = cw.minimumWidth; } totalDistributed += pixels; widths[i] = pixels; } } // Distribute any remaining pixels // to columns with weight. int diff = rest - totalDistributed; for (int i = 0; diff > 0; i++) { if (i == size) { i = 0; } ColumnLayoutData col = columns.get(i); if (col instanceof ColumnWeightData) { ++widths[i]; --diff; } } } for (int i = 0; i < size; i++) { if (tableColumns[i].getWidth() != widths[i]) { tableColumns[i].setWidth(widths[i]); } } } }